load packages

# outlier function for descriptive graphs
is_outlier <- function(x) {
  return(x < quantile(x, 0.25) - 1.5 * IQR(x) | x > quantile(x, 0.75) + 1.5 * IQR(x))}

# elbow finder for number of nzero coefficients
elbow_finder <- function(x_values, y_values) {
  # Max values to create line
  max_x_x <- max(x_values)
  max_x_y <- y_values[which.max(x_values)]
  max_y_y <- max(y_values)
  max_y_x <- x_values[which.max(y_values)]
  max_df <- data.frame(x = c(max_y_x, max_x_x), y = c(max_y_y, max_x_y))
  
  # Creating straight line between the max values
  fit <- lm(max_df$y ~ max_df$x)
  
  # Distance from point to line
  distances <- c()
  for(i in 1:length(x_values)) {
    distances <- c(distances, abs(coef(fit)[2]*x_values[i] - y_values[i] + coef(fit)[1]) / sqrt(coef(fit)[2]^2 + 1^2))
  }
  
  # Max distance point
  x_max_dist <- x_values[which.max(distances)]
  y_max_dist <- y_values[which.max(distances)]
  
  return(c(x_max_dist, y_max_dist))
}
options(scipen=999)
writeLines(capture.output(sessionInfo()), "sessionInfo.txt")

Load saved data to start from here

Note that the working directory is the directory where the Script is located

Here I provide the prepared Data:

load(file= "InputData/ClockCalculationsInput/Data_CVS_ITU.Rdata")
load(file= "InputData/ClockCalculationsInput/Data_Cord_ITU.Rdata")
load(file= "InputData/ClockCalculationsInput/Data_Placenta_ITU.Rdata")
load(file="InputData/ClockCalculationsInput/Data_Full_ITU.Rdata") # data persons with all measurement points available
load(file="InputData/ClockCalculationsInput/Data_Cord_Placenta_ITU.Rdata")
load(file="InputData/ClockCalculationsInput/Data_CVS_Placenta_ITU.Rdata")
load(file="InputData/ClockCalculationsInput/Data_CVS_Cord_ITU.Rdata")
load(file="InputData/ClockCalculationsInput/Data_ITU_all.Rdata") # all persons together in one data frame

load(file= "InputData/ClockCalculationsInput/Data_Placenta_male_ITU.Rdata")
load(file= "InputData/ClockCalculationsInput/Data_Placenta_female_ITU.Rdata")

load(file="InputData/ClockCalculationsInput/Data_PREDO_450Kcord.Rdata")
load(file="InputData/ClockCalculationsInput/Data_PREDO_EPICcord.Rdata")
load(file="InputData/ClockCalculationsInput/Data_PREDO_EPICplacenta.Rdata")
load(file="InputData/ClockCalculationsInput/Data_PREDO_EPIC_Cord_Placenta.Rdata")
load(file="InputData/ClockCalculationsInput/Data_PREDO_EPIC_all.Rdata") # all persons with EPIC data together in one data frame

load(file="InputData/ClockCalculationsInput/Data_PREDO_Placenta_male.Rdata")
load(file="InputData/ClockCalculationsInput/Data_PREDO_Placenta_female.Rdata")

This is how I calculated measures of age acceleration/deceleration:

  • EAAR <- as.numeric(residuals(lm(DNAmGA_Lee ~ Gestational_Age_Weeks + Trophoblasts + Stromal + Hofbauer + Endothelial + nRBC + Syncytiotrophoblast + PC1_ethnicity + PC2_ethnicity, data=X, na.action=na.exclude)))
    = a positive value means acceleration, a negative value deceleration

Sample overview

to the top

General Comments

note on the influence of missing CpGs:

  • for the clock of placenta (Lee): not all CpGs included in the clock would have been included after our QC, however they were used here because they are needed for the clock (discussed with Steve Horvath).

  • for the clock of placenta (Mayne): not all CpGs of the clock are available, because the clock was again trained on 450K/27K data. Although the authors here did not report the comparability between the reduced and full clock, we excluded the 5 missing CpGs (that are in the clock, but not in our data) and predicted age.

  • for the clock of Bohlin et al. (cordblood), 8 CpGs are missing in the EPIC data (clock designed on Illumina 450K/27K/CHARM data). Again, the authors did not report a correlation between a reduced and full clock.

  • for the clock of Knight et al. (cordblood), 6 CpGs are missing in the EPIC data, because the clock was designed on Illumina 450K/27K data. Here, Knight et al. claimed that the clock would work anyways (tested correlation between estimates from reduced predictor and full predictor).

  • the correlation between the estimated DNAmGA of the full and reduced Bohlin clock is r= .99 p < 2.2e-16 (tested with PREDO 450K)

  • the mean of the weights of the missing CpGS of the Bohlin clock is -2.159

  • the reported correlation between the estimated DNAmGA of the full and reduced Knight clock is r=.995

  • in our data the correlation is r=.97 p < 2.2e-16

  • the estimation from the reduced clock is again on average higher than the estimation from the full clock

  • the mean of the weights of the missing CpGS of the Bohlin clock is -0.767
    -> overall, both the reduced and full clock come to quite similar results, but the mean DNAm GA estimate differs (account for by using residuals)

McEwen et al. (2018) tested if the 19 CpGs from the Horvath and the 6 CpGs from the Hannum Clock missing on the EPIC array have a great impact on the performance of the Clocks. They had data from both 450K and EPIC. Additionally, they tested the influence of different preprocessing strategies.

https://pubmed.ncbi.nlm.nih.gov/30326963/

Dhingra et al. (2019) also evaluated the influence of missing CpGs of the Horvath clock by comparing 450K/EPIC data.

https://pubmed.ncbi.nlm.nih.gov/31002714/

In summary, it is better to use age-adjusted residuals as a measure of age acceleration/deceleration, compared to the raw difference between estimated and chronological age.

Data Preparation

CVS, data preparation for models

regression input

# EAAR, without alcohol
Reg_Input_Data_CVS_ITU_EAAR_n <- Data_CVS_ITU[, c("EAAR_Lee", "Child_Sex", "Gestational_Age_Weeks", "Maternal_Age_Years", "smoking_dichotom", "Delivery_mode_dichotom", "Maternal_Body_Mass_Index_in_Early_Pregnancy", "Child_Birth_Weight","Child_Birth_Length", "Child_Head_Circumference_At_Birth","Parity_dichotom", "Induced_Labour", "Maternal_Hypertension_dichotom", "Maternal_Diabetes_dichotom", "Maternal_Mental_Disorders")]

# EAAR, with alcohol
Reg_Input_Data_CVS_ITU_EAAR_wa <- Data_CVS_ITU[, c("EAAR_Lee", "Child_Sex", "Gestational_Age_Weeks", "Maternal_Age_Years", "smoking_dichotom", "Delivery_mode_dichotom", "Maternal_Body_Mass_Index_in_Early_Pregnancy", "Child_Birth_Weight","Child_Birth_Length", "Child_Head_Circumference_At_Birth","Parity_dichotom", "Induced_Labour", "Maternal_Hypertension_dichotom", "Maternal_Diabetes_dichotom", "Maternal_Mental_Disorders", "maternal_alcohol_use")]
sapply(Reg_Input_Data_CVS_ITU_EAAR_n, function(x) sum(is.na(x)))
                                   EAAR_Lee                                   Child_Sex 
                                         64                                           0 
                      Gestational_Age_Weeks                          Maternal_Age_Years 
                                          0                                           0 
                           smoking_dichotom                      Delivery_mode_dichotom 
                                          2                                           0 
Maternal_Body_Mass_Index_in_Early_Pregnancy                          Child_Birth_Weight 
                                          0                                           0 
                         Child_Birth_Length           Child_Head_Circumference_At_Birth 
                                          2                                           5 
                            Parity_dichotom                              Induced_Labour 
                                          0                                           0 
             Maternal_Hypertension_dichotom                  Maternal_Diabetes_dichotom 
                                          0                                           0 
                  Maternal_Mental_Disorders 
                                          1 
sapply(Reg_Input_Data_CVS_ITU_EAAR_wa, function(x) sum(is.na(x)))
                                   EAAR_Lee                                   Child_Sex 
                                         64                                           0 
                      Gestational_Age_Weeks                          Maternal_Age_Years 
                                          0                                           0 
                           smoking_dichotom                      Delivery_mode_dichotom 
                                          2                                           0 
Maternal_Body_Mass_Index_in_Early_Pregnancy                          Child_Birth_Weight 
                                          0                                           0 
                         Child_Birth_Length           Child_Head_Circumference_At_Birth 
                                          2                                           5 
                            Parity_dichotom                              Induced_Labour 
                                          0                                           0 
             Maternal_Hypertension_dichotom                  Maternal_Diabetes_dichotom 
                                          0                                           0 
                  Maternal_Mental_Disorders                        maternal_alcohol_use 
                                          1                                          97 

data frame without missings

Reg_Input_Data_CVS_ITU_EAAR_n_noNa <- na.omit(Reg_Input_Data_CVS_ITU_EAAR_n) 
dim(Reg_Input_Data_CVS_ITU_EAAR_n_noNa)
[1] 195  15
Reg_Input_Data_CVS_ITU_EAAR_wa_noNa <- na.omit(Reg_Input_Data_CVS_ITU_EAAR_wa) 
dim(Reg_Input_Data_CVS_ITU_EAAR_wa_noNa)
[1] 133  16
skimr::skim(Reg_Input_Data_CVS_ITU_EAAR_n_noNa)
── Data Summary ────────────────────────
                           Values                      
Name                       Reg_Input_Data_CVS_ITU_EA...
Number of rows             195                         
Number of columns          15                          
_______________________                                
Column type frequency:                                 
  factor                   8                           
  numeric                  7                           
________________________                               
Group variables            None                        

── Variable type: factor ────────────────────────────────────────────────────────────────────────────────────────────────────
  skim_variable                  n_missing complete_rate ordered n_unique top_counts       
1 Child_Sex                              0             1 FALSE          2 mal: 98, fem: 97 
2 smoking_dichotom                       0             1 FALSE          2 no: 173, yes: 22 
3 Delivery_mode_dichotom                 0             1 FALSE          2 una: 136, aid: 59
4 Parity_dichotom                        0             1 FALSE          2 giv: 116, no : 79
5 Induced_Labour                         0             1 FALSE          2 no: 149, yes: 46 
6 Maternal_Hypertension_dichotom         0             1 FALSE          2 no : 179, hyp: 16
7 Maternal_Diabetes_dichotom             0             1 FALSE          2 no : 150, dia: 45
8 Maternal_Mental_Disorders              0             1 FALSE          2 No: 175, Yes: 20 

── Variable type: numeric ───────────────────────────────────────────────────────────────────────────────────────────────────
  skim_variable                               n_missing complete_rate      mean      sd      p0      p25       p50      p75
1 EAAR_Lee                                            0             1   -0.0212   0.940   -2.17   -0.685    0.0923    0.591
2 Gestational_Age_Weeks                               0             1   40.0      1.61    29      39.3     40        41.1  
3 Maternal_Age_Years                                  0             1   35.5      5.51    21.1    31.6     35.6      39.8  
4 Maternal_Body_Mass_Index_in_Early_Pregnancy         0             1   24.4      4.21    18.1    21.7     23.4      26.0  
5 Child_Birth_Weight                                  0             1 3519.     529.    1415    3175     3560      3858.   
6 Child_Birth_Length                                  0             1   50.1      2.21    40      49       50        52    
7 Child_Head_Circumference_At_Birth                   0             1   35.1      1.76    26      34       35        36    
     p100 hist 
1    2.90 ▂▆▇▂▁
2   42.4  ▁▁▁▅▇
3   45.4  ▂▃▇▇▆
4   41.5  ▇▇▂▁▁
5 4660    ▁▁▆▇▃
6   56    ▁▁▅▇▂
7   39.5  ▁▁▅▇▃
save(Reg_Input_Data_CVS_ITU_EAAR_n_noNa, file="InputData/ClockCalculationsInput/Reg_Input_Data_CVS_ITU_EAAR_n_noNa.Rdata")
save(Reg_Input_Data_CVS_ITU_EAAR_wa_noNa, file="InputData/ClockCalculationsInput/Reg_Input_Data_CVS_ITU_EAAR_wa_noNa.Rdata")

to the top

Cord blood, data preparation for models

regression input

# EAAR without alcohol
Reg_Input_Data_Cord_ITU_EAAR_n <- Data_Cord_ITU[, c("EAAR_Bohlin", "Child_Sex", "Maternal_Age_Years", "smoking_dichotom", "Delivery_mode_dichotom", "Maternal_Body_Mass_Index_in_Early_Pregnancy", "Child_Birth_Weight","Child_Birth_Length", "Child_Head_Circumference_At_Birth","Parity_dichotom", "Induced_Labour", "Maternal_Hypertension_dichotom", "Maternal_Diabetes_dichotom", "Maternal_Mental_Disorders")]

# EAAR with alcohol
Reg_Input_Data_Cord_ITU_EAAR_wa <- Data_Cord_ITU[, c("EAAR_Bohlin", "Child_Sex", "Maternal_Age_Years", "smoking_dichotom",  "Delivery_mode_dichotom", "Maternal_Body_Mass_Index_in_Early_Pregnancy", "Child_Birth_Weight","Child_Birth_Length", "Child_Head_Circumference_At_Birth","Parity_dichotom", "Induced_Labour", "Maternal_Hypertension_dichotom", "Maternal_Diabetes_dichotom", "Maternal_Mental_Disorders", "maternal_alcohol_use")]
sapply(Data_Cord_ITU, function(x) sum(is.na(x)))
                                                            Sample_Name 
                                                                      0 
                                                                arrayid 
                                                                      0 
                                                                   CD8T 
                                                                      0 
                                                                   CD4T 
                                                                      0 
                                                                     NK 
                                                                      0 
                                                                  Bcell 
                                                                      0 
                                                                   Mono 
                                                                      0 
                                                                   Gran 
                                                                      0 
                                                                   nRBC 
                                                                      0 
                                                          caseVScontrol 
                                                                      0 
                                                               Warnings 
                                                                      0 
                                                     Maternal_Age_Years 
                                                                      0 
                                                                 Parity 
                                                                      0 
                                                      Mother_Cohabiting 
                                                                     54 
                                        Maternal_Hypertensive_Disorders 
                                                                      0 
                                            Maternal_Diabetes_Disorders 
                                                                      0 
                                              Maternal_Mental_Disorders 
                                                                      0 
                                      Maternal_Smoking_During_Pregnancy 
                                                                      0 
                     Maternal_Corticosteroid_Treatment_during_Pregnancy 
                                                                      0 
                                          Betamethasone_Number_of_Doses 
                                                                      1 
                     Gestational_Weeks_at_First_Betamethasone_Treatment 
                                                                    417 
                      Gestational_Weeks_at_Last_Betamethasone_Treatment 
                                                                    417 
                                     Maternal_Weight_In_Early_Pregnancy 
                                                                      0 
                                                        Maternal_Height 
                                                                      0 
                                                 Maternal_Height_Meters 
                                                                      0 
                            Maternal_Body_Mass_Index_in_Early_Pregnancy 
                                                                      0 
                Maternal_Body_Mass_Index_in_Early_Pregnancy_4categories 
                                                                      0 
                            Weeks_of_Gestation_at_First_Antenatal_Visit 
                                                                      2 
                                       Maternal_Weight_End_of_Pregnancy 
                                                                      3 
                 Gestational_Weeks_At_EndOfPregnancy_Weight_Measurement 
                                                                     13 
                                                       Child_Birth_Year 
                                                                      0 
                                                              Child_Sex 
                                                                      0 
                                                  Gestational_Age_Weeks 
                                                                      0 
                                                   Gestational_Age_Days 
                                                                      0 
                                                     Child_Birth_Weight 
                                                                      0 
                                                     Child_Birth_Length 
                                                                      4 
                                      Child_Head_Circumference_At_Birth 
                                                                      9 
                                                 Placental_Weight_Grams 
                                                                     11 
                                                 Child_Born_DeadorAlive 
                                                                      0 
                                                         Induced_Labour 
                                                                      0 
                                              Child_Apgar_Score_1Minute 
                                                                      1 
                                             Child_Apgar_Score_5Minutes 
                                                                    133 
                                                    Child_NeonatalDeath 
                                                                    426 
                                                         SingletonBirth 
                                                                      0 
                                                         NICU_Treatment 
                                                                      0 
                                                               Asphyxia 
                                                                      0 
                                                      Caesarian_Section 
                                                                      0 
                                                          Delivery_mode 
                                                                      0 
                                                 Delivery_mode_dichotom 
                                                                      0 
                                                        Parity_dichotom 
                                                                      0 
                                                       smoking_dichotom 
                                                                      0 
                                             Maternal_Diabetes_dichotom 
                                                                      0 
                                          Maternal_Hypertension_3levels 
                                                                      0 
                                         Maternal_Hypertension_dichotom 
                                                                      0 
                                                    gestage_at_CVS_days 
                                                                    351 
                                                   gestage_at_CVS_weeks 
                                                                    351 
                                                                preterm 
                                                                      0 
                                                   maternal_alcohol_use 
                                                                     21 
                                  TimeDifferencePlacenta_birth_sampling 
                                                                     57 
                                                              education 
                                                                     18 
                                              education_with_imputation 
                                                                     13 
                                                     maternal_education 
                                                                     18 
                                                        t1_gestageweeks 
                                                                    115 
                                                        t2_gestageweeks 
                                                                    104 
                                                        t3_gestageweeks 
                                                                     92 
                                                             Cesd_trim1 
                                                                    118 
                                                             Cesd_trim2 
                                                                    108 
                                                             Cesd_trim3 
                                                                     94 
                                                   state_anxtotal_trim1 
                                                                    119 
                                                   state_anxtotal_trim2 
                                                                    111 
                                                   state_anxtotal_trim3 
                                                                     95 
                                                              mean_cesd 
                                                                     65 
                                                              mean_stai 
                                                                     66 
                                                          PC1_ethnicity 
                                                                     31 
                                                          PC2_ethnicity 
                                                                     31 
                                                          PC3_ethnicity 
                                                                     31 
                                      ASQ_agespecificquestionnairegroup 
                                                                     85 
                                   ChildAge_ASQ_months_final_30pr_range 
                                                                     89 
         Child_ASQpersonalandsocialskills_dev_infancy_sum_finalagerange 
                                                                     90 
         Child_ASQ_problemsolving_development_infancy_sum_finalagerange 
                                                                     92 
              Child_ASQ_finemotor_development_infancy_sum_finalagerange 
                                                                     89 
             Child_ASQ_grossmotor_development_infancy_sum_finalagerange 
                                                                     89 
              Child_ASQ_communication_develop_infancy_sum_finalagerange 
                                                                     89 
       Child_ASQ_totaldevelopmentalmilestones_Infancy_Sum_finalagerange 
                                                                     92 
  Child_ASQpersonalandsocialskills_dev_infancy_sum_finalagerange_scaled 
                                                                     90 
  Child_ASQ_problemsolving_development_infancy_sum_finalagerange_scaled 
                                                                     92 
       Child_ASQ_finemotor_development_infancy_sum_finalagerange_scaled 
                                                                     89 
      Child_ASQ_grossmotor_development_infancy_sum_finalagerange_scaled 
                                                                     89 
       Child_ASQ_communication_develop_infancy_sum_finalagerange_scaled 
                                                                     89 
Child_ASQ_totaldevelopmentalmilestones_Infancy_Sum_finalagerange_scaled 
                                                                     92 
     Child_ASQpersonalandsocialskills_dev_infancy_sum_finalagerange_cat 
                                                                     90 
     Child_ASQ_problemsolving_development_infancy_sum_finalagerange_cat 
                                                                     92 
          Child_ASQ_finemotor_development_infancy_sum_finalagerange_cat 
                                                                     89 
         Child_ASQ_grossmotor_development_infancy_sum_finalagerange_cat 
                                                                     89 
          Child_ASQ_communication_develop_infancy_sum_finalagerange_cat 
                                                                     89 
   Child_ASQ_totaldevelopmentalmilestones_Infancy_Sum_finalagerange_cat 
                                                                     92 
                                                          delayed_count 
                                                                     92 
                                                          DNAmGA_Knight 
                                                                      0 
                                                          DNAmGA_Bohlin 
                                                                      0 
                                                         DNAmGA_Haftorn 
                                                                      0 
                                                            EAAR_Bohlin 
                                                                     31 
                                                            EAAR_Knight 
                                                                     31 
                                                           EAAR_Haftorn 
                                                                     31 
                                                           delta_Bohlin 
                                                                      0 
                                                           delta_Knight 
                                                                      0 
                                                          delta_Haftorn 
                                                                      0 
                                                          zdelta_Bohlin 
                                                                      0 
                                                          zdelta_Knight 
                                                                      0 
                                                         zdelta_Haftorn 
                                                                      0 

data frame without missings

Reg_Input_Data_Cord_ITU_EAAR_noNa_n <- na.omit(Reg_Input_Data_Cord_ITU_EAAR_n) 
dim(Reg_Input_Data_Cord_ITU_EAAR_noNa_n)
[1] 385  14
Reg_Input_Data_Cord_ITU_EAAR_noNa_wa <- na.omit(Reg_Input_Data_Cord_ITU_EAAR_wa) 
dim(Reg_Input_Data_Cord_ITU_EAAR_noNa_wa)
[1] 367  15
skimr::skim(Reg_Input_Data_Cord_ITU_EAAR_noNa_n)
── Data Summary ────────────────────────
                           Values                      
Name                       Reg_Input_Data_Cord_ITU_E...
Number of rows             385                         
Number of columns          14                          
_______________________                                
Column type frequency:                                 
  factor                   8                           
  numeric                  6                           
________________________                               
Group variables            None                        

── Variable type: factor ────────────────────────────────────────────────────────────────────────────────────────────────────
  skim_variable                  n_missing complete_rate ordered n_unique top_counts        
1 Child_Sex                              0             1 FALSE          2 fem: 193, mal: 192
2 smoking_dichotom                       0             1 FALSE          2 no: 369, yes: 16  
3 Delivery_mode_dichotom                 0             1 FALSE          2 una: 271, aid: 114
4 Parity_dichotom                        0             1 FALSE          2 no : 209, giv: 176
5 Induced_Labour                         0             1 FALSE          2 no: 285, yes: 100 
6 Maternal_Hypertension_dichotom         0             1 FALSE          2 no : 361, hyp: 24 
7 Maternal_Diabetes_dichotom             0             1 FALSE          2 no : 298, dia: 87 
8 Maternal_Mental_Disorders              0             1 FALSE          2 No: 341, Yes: 44  

── Variable type: numeric ───────────────────────────────────────────────────────────────────────────────────────────────────
  skim_variable                               n_missing complete_rate        mean      sd      p0      p25       p50      p75
1 EAAR_Bohlin                                         0             1   -0.000994   0.488   -1.53   -0.311   -0.0209    0.311
2 Maternal_Age_Years                                  0             1   34.7        4.70    20.3    31.5     34.3      38.0  
3 Maternal_Body_Mass_Index_in_Early_Pregnancy         0             1   23.9        4.06    16.3    21.2     22.9      25.7  
4 Child_Birth_Weight                                  0             1 3537.       492.    1140    3260     3570      3820    
5 Child_Birth_Length                                  0             1   50.2        2.20    38      49       50        51    
6 Child_Head_Circumference_At_Birth                   0             1   35.1        1.52    26      34       35        36    
     p100 hist 
1    1.26 ▁▂▇▅▂
2   49.5  ▁▅▇▅▁
3   51.0  ▇▅▁▁▁
4 4660    ▁▁▃▇▂
5   57    ▁▁▃▇▁
6   40    ▁▁▃▇▁
save(Reg_Input_Data_Cord_ITU_EAAR_noNa_wa, file="InputData/ClockCalculationsInput/Reg_Input_Data_Cord_ITU_EAAR_noNa_wa.Rdata")
save(Reg_Input_Data_Cord_ITU_EAAR_noNa_n, file="InputData/ClockCalculationsInput/Reg_Input_Data_Cord_ITU_EAAR_noNa_n.Rdata")

to the top

Placenta, data preparation for model

regression input

# without alcohol
Reg_Input_Data_Placenta_ITU_EAAR_n <- Data_Placenta_ITU[, c("EAAR_Lee", "Child_Sex", "Maternal_Age_Years", "smoking_dichotom",  "Delivery_mode_dichotom", "Maternal_Body_Mass_Index_in_Early_Pregnancy", "Child_Birth_Weight","Child_Birth_Length", "Child_Head_Circumference_At_Birth","Parity_dichotom", "Induced_Labour", "Maternal_Hypertension_dichotom", "Maternal_Diabetes_dichotom", "Maternal_Mental_Disorders")]

# with alcohol
Reg_Input_Data_Placenta_ITU_EAAR_wa <- Data_Placenta_ITU[, c("EAAR_Lee", "Child_Sex", "Maternal_Age_Years", "smoking_dichotom",  "Delivery_mode_dichotom", "Maternal_Body_Mass_Index_in_Early_Pregnancy", "Child_Birth_Weight","Child_Birth_Length", "Child_Head_Circumference_At_Birth","Parity_dichotom", "Induced_Labour", "Maternal_Hypertension_dichotom", "Maternal_Diabetes_dichotom", "Maternal_Mental_Disorders", "maternal_alcohol_use")]
# for split by sex
# with alcohol
Reg_Input_Data_Placenta_male_ITU_EAAR_wa <- Data_Placenta_male_ITU[, c("EAAR_Lee", "Child_Sex", "Maternal_Age_Years", "smoking_dichotom",  "Delivery_mode_dichotom", "Maternal_Body_Mass_Index_in_Early_Pregnancy", "Child_Birth_Weight","Child_Birth_Length", "Child_Head_Circumference_At_Birth","Parity_dichotom", "Induced_Labour", "Maternal_Hypertension_dichotom", "Maternal_Diabetes_dichotom", "Maternal_Mental_Disorders", "maternal_alcohol_use")]

# without alcohol
Reg_Input_Data_Placenta_male_ITU_EAAR_n <- Data_Placenta_male_ITU[, c("EAAR_Lee", "Child_Sex", "Maternal_Age_Years", "smoking_dichotom",  "Delivery_mode_dichotom", "Maternal_Body_Mass_Index_in_Early_Pregnancy", "Child_Birth_Weight","Child_Birth_Length", "Child_Head_Circumference_At_Birth","Parity_dichotom", "Induced_Labour", "Maternal_Hypertension_dichotom", "Maternal_Diabetes_dichotom", "Maternal_Mental_Disorders")]


# with alcohol
Reg_Input_Data_Placenta_female_ITU_EAAR_wa <- Data_Placenta_female_ITU[, c("EAAR_Lee", "Child_Sex", "Maternal_Age_Years", "smoking_dichotom",  "Delivery_mode_dichotom", "Maternal_Body_Mass_Index_in_Early_Pregnancy", "Child_Birth_Weight","Child_Birth_Length", "Child_Head_Circumference_At_Birth","Parity_dichotom", "Induced_Labour", "Maternal_Hypertension_dichotom", "Maternal_Diabetes_dichotom", "Maternal_Mental_Disorders", "maternal_alcohol_use")]

# without alcohol
Reg_Input_Data_Placenta_female_ITU_EAAR_n <- Data_Placenta_female_ITU[, c("EAAR_Lee", "Child_Sex", "Maternal_Age_Years", "smoking_dichotom",  "Delivery_mode_dichotom", "Maternal_Body_Mass_Index_in_Early_Pregnancy", "Child_Birth_Weight","Child_Birth_Length", "Child_Head_Circumference_At_Birth","Parity_dichotom", "Induced_Labour", "Maternal_Hypertension_dichotom", "Maternal_Diabetes_dichotom", "Maternal_Mental_Disorders")]
sapply(Data_Placenta_ITU, function(x) sum(is.na(x)))
                                                            Sample_Name 
                                                                      0 
                                                           Trophoblasts 
                                                                      0 
                                                                Stromal 
                                                                      0 
                                                               Hofbauer 
                                                                      0 
                                                            Endothelial 
                                                                      0 
                                                                   nRBC 
                                                                      0 
                                                    Syncytiotrophoblast 
                                                                      0 
                                                          caseVScontrol 
                                                                      0 
                                                               Warnings 
                                                                      0 
                                                     Maternal_Age_Years 
                                                                      0 
                                                                 Parity 
                                                                      0 
                                                      Mother_Cohabiting 
                                                                     64 
                                        Maternal_Hypertensive_Disorders 
                                                                      0 
                                            Maternal_Diabetes_Disorders 
                                                                      0 
                                              Maternal_Mental_Disorders 
                                                                      0 
                                      Maternal_Smoking_During_Pregnancy 
                                                                      0 
                     Maternal_Corticosteroid_Treatment_during_Pregnancy 
                                                                      0 
                                          Betamethasone_Number_of_Doses 
                                                                      1 
                     Gestational_Weeks_at_First_Betamethasone_Treatment 
                                                                    475 
                      Gestational_Weeks_at_Last_Betamethasone_Treatment 
                                                                    475 
                                     Maternal_Weight_In_Early_Pregnancy 
                                                                      0 
                                                        Maternal_Height 
                                                                      0 
                                                 Maternal_Height_Meters 
                                                                      0 
                            Maternal_Body_Mass_Index_in_Early_Pregnancy 
                                                                      0 
                Maternal_Body_Mass_Index_in_Early_Pregnancy_4categories 
                                                                      0 
                            Weeks_of_Gestation_at_First_Antenatal_Visit 
                                                                      2 
                                       Maternal_Weight_End_of_Pregnancy 
                                                                      2 
                 Gestational_Weeks_At_EndOfPregnancy_Weight_Measurement 
                                                                     11 
                                                       Child_Birth_Year 
                                                                      0 
                                                              Child_Sex 
                                                                      0 
                                                  Gestational_Age_Weeks 
                                                                      0 
                                                   Gestational_Age_Days 
                                                                      0 
                                                     Child_Birth_Weight 
                                                                      0 
                                                     Child_Birth_Length 
                                                                      5 
                                      Child_Head_Circumference_At_Birth 
                                                                     11 
                                                 Placental_Weight_Grams 
                                                                     11 
                                                 Child_Born_DeadorAlive 
                                                                      0 
                                                         Induced_Labour 
                                                                      0 
                                              Child_Apgar_Score_1Minute 
                                                                      1 
                                             Child_Apgar_Score_5Minutes 
                                                                    162 
                                                    Child_NeonatalDeath 
                                                                    486 
                                                         SingletonBirth 
                                                                      0 
                                                         NICU_Treatment 
                                                                      0 
                                                               Asphyxia 
                                                                      0 
                                                      Caesarian_Section 
                                                                      0 
                                                          Delivery_mode 
                                                                      0 
                                                 Delivery_mode_dichotom 
                                                                      0 
                                                        Parity_dichotom 
                                                                      0 
                                                       smoking_dichotom 
                                                                      0 
                                             Maternal_Diabetes_dichotom 
                                                                      0 
                                          Maternal_Hypertension_3levels 
                                                                      0 
                                         Maternal_Hypertension_dichotom 
                                                                      0 
                                                    gestage_at_CVS_days 
                                                                    397 
                                                   gestage_at_CVS_weeks 
                                                                    397 
                                                                preterm 
                                                                      0 
                                                   maternal_alcohol_use 
                                                                     17 
                                  TimeDifferencePlacenta_birth_sampling 
                                                                     54 
                                                              education 
                                                                     19 
                                              education_with_imputation 
                                                                     15 
                                                     maternal_education 
                                                                     19 
                                                        t1_gestageweeks 
                                                                    135 
                                                        t2_gestageweeks 
                                                                    121 
                                                        t3_gestageweeks 
                                                                    110 
                                                             Cesd_trim1 
                                                                    140 
                                                             Cesd_trim2 
                                                                    121 
                                                             Cesd_trim3 
                                                                    111 
                                                   state_anxtotal_trim1 
                                                                    140 
                                                   state_anxtotal_trim2 
                                                                    123 
                                                   state_anxtotal_trim3 
                                                                    111 
                                                              mean_cesd 
                                                                     76 
                                                              mean_stai 
                                                                     77 
                                                          PC1_ethnicity 
                                                                     47 
                                                          PC2_ethnicity 
                                                                     47 
                                                          PC3_ethnicity 
                                                                     47 
                                      ASQ_agespecificquestionnairegroup 
                                                                     94 
                                   ChildAge_ASQ_months_final_30pr_range 
                                                                     99 
         Child_ASQpersonalandsocialskills_dev_infancy_sum_finalagerange 
                                                                    100 
         Child_ASQ_problemsolving_development_infancy_sum_finalagerange 
                                                                    101 
              Child_ASQ_finemotor_development_infancy_sum_finalagerange 
                                                                     99 
             Child_ASQ_grossmotor_development_infancy_sum_finalagerange 
                                                                     99 
              Child_ASQ_communication_develop_infancy_sum_finalagerange 
                                                                     99 
       Child_ASQ_totaldevelopmentalmilestones_Infancy_Sum_finalagerange 
                                                                    101 
  Child_ASQpersonalandsocialskills_dev_infancy_sum_finalagerange_scaled 
                                                                    100 
  Child_ASQ_problemsolving_development_infancy_sum_finalagerange_scaled 
                                                                    101 
       Child_ASQ_finemotor_development_infancy_sum_finalagerange_scaled 
                                                                     99 
      Child_ASQ_grossmotor_development_infancy_sum_finalagerange_scaled 
                                                                     99 
       Child_ASQ_communication_develop_infancy_sum_finalagerange_scaled 
                                                                     99 
Child_ASQ_totaldevelopmentalmilestones_Infancy_Sum_finalagerange_scaled 
                                                                    101 
     Child_ASQpersonalandsocialskills_dev_infancy_sum_finalagerange_cat 
                                                                    100 
     Child_ASQ_problemsolving_development_infancy_sum_finalagerange_cat 
                                                                    101 
          Child_ASQ_finemotor_development_infancy_sum_finalagerange_cat 
                                                                     99 
         Child_ASQ_grossmotor_development_infancy_sum_finalagerange_cat 
                                                                     99 
          Child_ASQ_communication_develop_infancy_sum_finalagerange_cat 
                                                                     99 
   Child_ASQ_totaldevelopmentalmilestones_Infancy_Sum_finalagerange_cat 
                                                                    101 
                                                          delayed_count 
                                                                    101 
                                                             DNAmGA_Lee 
                                                                      0 
                                                           DNAmGA_Mayne 
                                                                      0 
                                                               EAAR_Lee 
                                                                     47 
                                                             EAAR_Mayne 
                                                                     47 
                                                              delta_Lee 
                                                                      0 
                                                            delta_Mayne 
                                                                      0 
                                                             zdelta_Lee 
                                                                      0 
                                                           zdelta_Mayne 
                                                                      0 

data frame without missings

Reg_Input_Data_Placenta_ITU_EAAR_noNa_n <- na.omit(Reg_Input_Data_Placenta_ITU_EAAR_n) 
dim(Reg_Input_Data_Placenta_ITU_EAAR_noNa_n)
[1] 427  14
Reg_Input_Data_Placenta_ITU_EAAR_noNa_wa <- na.omit(Reg_Input_Data_Placenta_ITU_EAAR_wa) 
dim(Reg_Input_Data_Placenta_ITU_EAAR_noNa_wa)
[1] 412  15
# for split by sex
Reg_Input_Data_Placenta_male_ITU_EAAR_noNa_wa <- na.omit(Reg_Input_Data_Placenta_male_ITU_EAAR_wa) 
dim(Reg_Input_Data_Placenta_male_ITU_EAAR_noNa_wa)
[1] 210  15
Reg_Input_Data_Placenta_male_ITU_EAAR_noNa_n <- na.omit(Reg_Input_Data_Placenta_male_ITU_EAAR_n) 
dim(Reg_Input_Data_Placenta_male_ITU_EAAR_noNa_n)
[1] 218  14
Reg_Input_Data_Placenta_female_ITU_EAAR_noNa_wa <- na.omit(Reg_Input_Data_Placenta_female_ITU_EAAR_wa) 
dim(Reg_Input_Data_Placenta_female_ITU_EAAR_noNa_wa)
[1] 202  15
Reg_Input_Data_Placenta_female_ITU_EAAR_noNa_n <- na.omit(Reg_Input_Data_Placenta_female_ITU_EAAR_n) 
dim(Reg_Input_Data_Placenta_female_ITU_EAAR_noNa_n)
[1] 209  14
skimr::skim(Reg_Input_Data_Placenta_ITU_EAAR_noNa_n)
── Data Summary ────────────────────────
                           Values                      
Name                       Reg_Input_Data_Placenta_I...
Number of rows             427                         
Number of columns          14                          
_______________________                                
Column type frequency:                                 
  factor                   8                           
  numeric                  6                           
________________________                               
Group variables            None                        

── Variable type: factor ────────────────────────────────────────────────────────────────────────────────────────────────────
  skim_variable                  n_missing complete_rate ordered n_unique top_counts        
1 Child_Sex                              0             1 FALSE          2 mal: 218, fem: 209
2 smoking_dichotom                       0             1 FALSE          2 no: 411, yes: 16  
3 Delivery_mode_dichotom                 0             1 FALSE          2 una: 305, aid: 122
4 Parity_dichotom                        0             1 FALSE          2 no : 217, giv: 210
5 Induced_Labour                         0             1 FALSE          2 no: 319, yes: 108 
6 Maternal_Hypertension_dichotom         0             1 FALSE          2 no : 402, hyp: 25 
7 Maternal_Diabetes_dichotom             0             1 FALSE          2 no : 333, dia: 94 
8 Maternal_Mental_Disorders              0             1 FALSE          2 No: 379, Yes: 48  

── Variable type: numeric ───────────────────────────────────────────────────────────────────────────────────────────────────
  skim_variable                               n_missing complete_rate        mean     sd     p0      p25       p50      p75
1 EAAR_Lee                                            0             1   -0.000685   1.11  -3.72   -0.668    0.0760    0.696
2 Maternal_Age_Years                                  0             1   34.6        4.73  20.3    31.4     34.5      38.0  
3 Maternal_Body_Mass_Index_in_Early_Pregnancy         0             1   23.7        4.02  15.8    21.2     22.7      25.4  
4 Child_Birth_Weight                                  0             1 3542.       507.   805    3265     3580      3868    
5 Child_Birth_Length                                  0             1   50.2        2.42  32      49       50        51    
6 Child_Head_Circumference_At_Birth                   0             1   35.1        1.65  23.5    34       35        36    
     p100 hist 
1    3.56 ▁▂▇▃▁
2   45.5  ▁▃▇▆▂
3   51.0  ▇▆▁▁▁
4 4660    ▁▁▂▇▃
5   57    ▁▁▁▇▁
6   40    ▁▁▁▇▁
save(Reg_Input_Data_Placenta_ITU_EAAR_noNa_wa, file="InputData/ClockCalculationsInput/Reg_Input_Data_Placenta_ITU_EAAR_noNa_wa.Rdata")

save(Reg_Input_Data_Placenta_ITU_EAAR_noNa_n, file="InputData/ClockCalculationsInput/Reg_Input_Data_Placenta_ITU_EAAR_noNa_n.Rdata")
save(Reg_Input_Data_Placenta_male_ITU_EAAR_noNa_wa, file="InputData/ClockCalculationsInput/Reg_Input_Data_Placenta_male_ITU_EAAR_noNa_wa.Rdata")
save(Reg_Input_Data_Placenta_male_ITU_EAAR_noNa_n, file="InputData/ClockCalculationsInput/Reg_Input_Data_Placenta_male_ITU_EAAR_noNa_n.Rdata")

save(Reg_Input_Data_Placenta_female_ITU_EAAR_noNa_wa, file="InputData/ClockCalculationsInput/Reg_Input_Data_Placenta_female_ITU_EAAR_noNa_wa.Rdata")
save(Reg_Input_Data_Placenta_female_ITU_EAAR_noNa_n, file="InputData/ClockCalculationsInput/Reg_Input_Data_Placenta_female_ITU_EAAR_noNa_n.Rdata")

to the top

cord blood data preparation for model

EPIC

regression input

# EAAR without alcohol
Reg_Input_Data_Cordblood_PREDO_EAAR_n <- Data_PREDO_EPICcord[, c("EAAR_Bohlin", "Child_Sex", "Gestational_Age", "Maternal_Age_18PopRegandBR", "smoking_dichotom", "Delivery_Mode_dichotom", "Maternal_PrepregnancyBMI18oct28new", "Birth_Weight","Birth_Length", "Head_Circumference_at_Birth","Parity_dichotom",  "inducedlabour", "maternal_diabetes_dichotom", "maternal_hypertension_dichotom", "Maternal_Mental_Disorders_By_Childbirth")]

# EAAR with alcohol
Reg_Input_Data_Cordblood_PREDO_EAAR_wa <- Data_PREDO_EPICcord[, c("EAAR_Bohlin", "Child_Sex", "Gestational_Age", "Maternal_Age_18PopRegandBR", "smoking_dichotom", "Alcohol_Use_In_Early_Pregnancy_19Oct", "Delivery_Mode_dichotom", "Maternal_PrepregnancyBMI18oct28new", "Birth_Weight","Birth_Length", "Head_Circumference_at_Birth","Parity_dichotom",  "inducedlabour", "maternal_diabetes_dichotom", "maternal_hypertension_dichotom", "Maternal_Mental_Disorders_By_Childbirth")]

data frame without missings

Reg_Input_Data_Cordblood_PREDO_EAAR_noNa_n <- na.omit(Reg_Input_Data_Cordblood_PREDO_EAAR_n) 
dim(Reg_Input_Data_Cordblood_PREDO_EAAR_noNa_n)
[1] 144  15
Reg_Input_Data_Cordblood_PREDO_EAAR_noNa_wa <- na.omit(Reg_Input_Data_Cordblood_PREDO_EAAR_wa) 
dim(Reg_Input_Data_Cordblood_PREDO_EAAR_noNa_wa)
[1] 130  16
skimr::skim(Reg_Input_Data_Cordblood_PREDO_EAAR_noNa_n)
── Data Summary ────────────────────────
                           Values                      
Name                       Reg_Input_Data_Cordblood_...
Number of rows             144                         
Number of columns          15                          
_______________________                                
Column type frequency:                                 
  factor                   8                           
  numeric                  7                           
________________________                               
Group variables            None                        

── Variable type: factor ────────────────────────────────────────────────────────────────────────────────────────────────────
  skim_variable                           n_missing complete_rate ordered n_unique top_counts       
1 Child_Sex                                       0             1 FALSE          2 fem: 73, mal: 71 
2 smoking_dichotom                                0             1 FALSE          2 no: 131, yes: 13 
3 Delivery_Mode_dichotom                          0             1 FALSE          2 una: 93, aid: 51 
4 Parity_dichotom                                 0             1 FALSE          2 giv: 81, no : 63 
5 inducedlabour                                   0             1 FALSE          2 No: 108, Yes: 36 
6 maternal_diabetes_dichotom                      0             1 FALSE          2 no : 119, dia: 25
7 maternal_hypertension_dichotom                  0             1 FALSE          2 no : 108, hyp: 36
8 Maternal_Mental_Disorders_By_Childbirth         0             1 FALSE          2 No: 126, Yes: 18 

── Variable type: numeric ───────────────────────────────────────────────────────────────────────────────────────────────────
  skim_variable                      n_missing complete_rate       mean      sd      p0      p25       p50      p75    p100
1 EAAR_Bohlin                                0             1   -0.00328   0.464   -1.10   -0.354    0.0201    0.310    1.08
2 Gestational_Age                            0             1   39.8       1.44    32.4    39.1     39.9      40.9     42.3 
3 Maternal_Age_18PopRegandBR                 0             1   32.1       4.98    19.4    28.2     32.1      35.4     43.4 
4 Maternal_PrepregnancyBMI18oct28new         0             1   25.2       5.76    17.2    21.2     23.4      27.4     46.5 
5 Birth_Weight                               0             1 3443.      518.    1100    3138.    3505      3771.    4810   
6 Birth_Length                               0             1   49.7       2.46    35      49       50        51       55   
7 Head_Circumference_at_Birth                0             1   35.2       1.35    31      34       35        36       38.5 
  hist 
1 ▂▆▇▅▂
2 ▁▁▂▇▆
3 ▁▅▇▆▂
4 ▇▆▂▁▁
5 ▁▁▅▇▁
6 ▁▁▂▇▂
7 ▁▅▇▆▁
save(Reg_Input_Data_Cordblood_PREDO_EAAR_noNa_wa, file="InputData/ClockCalculationsInput/Reg_Input_Data_Cordblood_PREDO_EAAR_noNa_wa.Rdata")

save(Reg_Input_Data_Cordblood_PREDO_EAAR_noNa_n, file="InputData/ClockCalculationsInput/Reg_Input_Data_Cordblood_PREDO_EAAR_noNa_n.Rdata")

to the top

cord blood data preparation for model

450K

regression input

# EAAR without alcohol
Reg_Input_Data_Cordblood_PREDO450K_EAAR_n <- Data_PREDO_450Kcord[, c("EAAR_Bohlin", "Child_Sex", "Gestational_Age", "Maternal_Age_18PopRegandBR", "smoking_dichotom", "Delivery_Mode_dichotom", "Maternal_PrepregnancyBMI18oct28new", "Birth_Weight","Birth_Length", "Head_Circumference_at_Birth","Parity_dichotom",  "inducedlabour", "maternal_diabetes_dichotom", "maternal_hypertension_dichotom", "Maternal_Mental_Disorders_By_Childbirth")]

#EAAR with alcohol
Reg_Input_Data_Cordblood_PREDO450K_EAAR_wa <- Data_PREDO_450Kcord[, c("EAAR_Bohlin", "Child_Sex", "Gestational_Age", "Maternal_Age_18PopRegandBR", "smoking_dichotom", "Alcohol_Use_In_Early_Pregnancy_19Oct", "Delivery_Mode_dichotom", "Maternal_PrepregnancyBMI18oct28new", "Birth_Weight","Birth_Length", "Head_Circumference_at_Birth","Parity_dichotom",  "inducedlabour", "maternal_diabetes_dichotom", "maternal_hypertension_dichotom", "Maternal_Mental_Disorders_By_Childbirth")]
sapply(Reg_Input_Data_Cordblood_PREDO450K_EAAR_wa, function(x) sum(is.na(x)))
                            EAAR_Bohlin                               Child_Sex                         Gestational_Age 
                                     10                                       0                                       2 
             Maternal_Age_18PopRegandBR                        smoking_dichotom    Alcohol_Use_In_Early_Pregnancy_19Oct 
                                      0                                       0                                     102 
                 Delivery_Mode_dichotom      Maternal_PrepregnancyBMI18oct28new                            Birth_Weight 
                                     19                                       0                                       3 
                           Birth_Length             Head_Circumference_at_Birth                         Parity_dichotom 
                                      3                                       3                                       6 
                          inducedlabour              maternal_diabetes_dichotom          maternal_hypertension_dichotom 
                                      3                                       0                                       0 
Maternal_Mental_Disorders_By_Childbirth 
                                      1 

data frame without missings

Reg_Input_Data_Cordblood_PREDO450K_EAAR_noNa_wa <- na.omit(Reg_Input_Data_Cordblood_PREDO450K_EAAR_wa) 
dim(Reg_Input_Data_Cordblood_PREDO450K_EAAR_noNa_wa)
[1] 665  16
Reg_Input_Data_Cordblood_PREDO450K_EAAR_noNa_n <- na.omit(Reg_Input_Data_Cordblood_PREDO450K_EAAR_n) 
dim(Reg_Input_Data_Cordblood_PREDO450K_EAAR_noNa_n)
[1] 766  15
skimr::skim(Reg_Input_Data_Cordblood_PREDO_EAAR_noNa_n)
── Data Summary ────────────────────────
                           Values                      
Name                       Reg_Input_Data_Cordblood_...
Number of rows             144                         
Number of columns          15                          
_______________________                                
Column type frequency:                                 
  factor                   8                           
  numeric                  7                           
________________________                               
Group variables            None                        

── Variable type: factor ────────────────────────────────────────────────────────────────────────────────────────────────────
  skim_variable                           n_missing complete_rate ordered n_unique top_counts       
1 Child_Sex                                       0             1 FALSE          2 fem: 73, mal: 71 
2 smoking_dichotom                                0             1 FALSE          2 no: 131, yes: 13 
3 Delivery_Mode_dichotom                          0             1 FALSE          2 una: 93, aid: 51 
4 Parity_dichotom                                 0             1 FALSE          2 giv: 81, no : 63 
5 inducedlabour                                   0             1 FALSE          2 No: 108, Yes: 36 
6 maternal_diabetes_dichotom                      0             1 FALSE          2 no : 119, dia: 25
7 maternal_hypertension_dichotom                  0             1 FALSE          2 no : 108, hyp: 36
8 Maternal_Mental_Disorders_By_Childbirth         0             1 FALSE          2 No: 126, Yes: 18 

── Variable type: numeric ───────────────────────────────────────────────────────────────────────────────────────────────────
  skim_variable                      n_missing complete_rate       mean      sd      p0      p25       p50      p75    p100
1 EAAR_Bohlin                                0             1   -0.00328   0.464   -1.10   -0.354    0.0201    0.310    1.08
2 Gestational_Age                            0             1   39.8       1.44    32.4    39.1     39.9      40.9     42.3 
3 Maternal_Age_18PopRegandBR                 0             1   32.1       4.98    19.4    28.2     32.1      35.4     43.4 
4 Maternal_PrepregnancyBMI18oct28new         0             1   25.2       5.76    17.2    21.2     23.4      27.4     46.5 
5 Birth_Weight                               0             1 3443.      518.    1100    3138.    3505      3771.    4810   
6 Birth_Length                               0             1   49.7       2.46    35      49       50        51       55   
7 Head_Circumference_at_Birth                0             1   35.2       1.35    31      34       35        36       38.5 
  hist 
1 ▂▆▇▅▂
2 ▁▁▂▇▆
3 ▁▅▇▆▂
4 ▇▆▂▁▁
5 ▁▁▅▇▁
6 ▁▁▂▇▂
7 ▁▅▇▆▁
save(Reg_Input_Data_Cordblood_PREDO450K_EAAR_noNa_wa, file="InputData/ClockCalculationsInput/Reg_Input_Data_Cordblood_PREDO450K_EAAR_noNa_wa.Rdata")

save(Reg_Input_Data_Cordblood_PREDO450K_EAAR_noNa_n, file="InputData/ClockCalculationsInput/Reg_Input_Data_Cordblood_PREDO450K_EAAR_noNa_n.Rdata")

to the top

placenta: data preparation for model

Placenta EPIC

regression input

# EAAR (with ethnicity) without alcohol
Reg_Input_Data_Placenta_PREDO_EAAR_n <- Data_PREDO_EPICplacenta[, c("EAAR_Lee", "Child_Sex", "Maternal_Age_18PopRegandBR", "smoking_dichotom", "Delivery_Mode_dichotom", "Maternal_PrepregnancyBMI18oct28new", "Birth_Weight","Birth_Length", "Head_Circumference_at_Birth","Parity_dichotom",  "inducedlabour", "maternal_diabetes_dichotom", "maternal_hypertension_dichotom", "Maternal_Mental_Disorders_By_Childbirth")]

# EAAR (with ethnicity) with alcohol
Reg_Input_Data_Placenta_PREDO_EAAR_wa <- Data_PREDO_EPICplacenta[, c("EAAR_Lee", "Child_Sex", "Maternal_Age_18PopRegandBR", "smoking_dichotom", "Alcohol_Use_In_Early_Pregnancy_19Oct", "Delivery_Mode_dichotom", "Maternal_PrepregnancyBMI18oct28new", "Birth_Weight","Birth_Length", "Head_Circumference_at_Birth","Parity_dichotom",  "inducedlabour", "maternal_diabetes_dichotom", "maternal_hypertension_dichotom", "Maternal_Mental_Disorders_By_Childbirth")]
# for split by sex
# with alcohol
Reg_Input_Data_Placenta_male_PREDO_EAAR_wa <- Data_PREDO_Placenta_male[, c("EAAR_Lee", "Child_Sex", "Maternal_Age_18PopRegandBR", "smoking_dichotom", "Alcohol_Use_In_Early_Pregnancy_19Oct", "Delivery_Mode_dichotom", "Maternal_PrepregnancyBMI18oct28new", "Birth_Weight","Birth_Length", "Head_Circumference_at_Birth","Parity_dichotom",  "inducedlabour", "maternal_diabetes_dichotom", "maternal_hypertension_dichotom", "Maternal_Mental_Disorders_By_Childbirth")]

# without alcohol
Reg_Input_Data_Placenta_male_PREDO_EAAR_n <- Data_PREDO_Placenta_male[, c("EAAR_Lee", "Child_Sex", "Maternal_Age_18PopRegandBR", "smoking_dichotom", "Delivery_Mode_dichotom", "Maternal_PrepregnancyBMI18oct28new", "Birth_Weight","Birth_Length", "Head_Circumference_at_Birth","Parity_dichotom",  "inducedlabour", "maternal_diabetes_dichotom", "maternal_hypertension_dichotom", "Maternal_Mental_Disorders_By_Childbirth")]


# with alcohol
Reg_Input_Data_Placenta_female_PREDO_EAAR_wa <- Data_PREDO_Placenta_female[, c("EAAR_Lee", "Child_Sex", "Maternal_Age_18PopRegandBR", "smoking_dichotom", "Alcohol_Use_In_Early_Pregnancy_19Oct", "Delivery_Mode_dichotom", "Maternal_PrepregnancyBMI18oct28new", "Birth_Weight","Birth_Length", "Head_Circumference_at_Birth","Parity_dichotom",  "inducedlabour", "maternal_diabetes_dichotom", "maternal_hypertension_dichotom", "Maternal_Mental_Disorders_By_Childbirth")]

# without alcohol
Reg_Input_Data_Placenta_female_PREDO_EAAR_n <- Data_PREDO_Placenta_female[, c("EAAR_Lee", "Child_Sex", "Maternal_Age_18PopRegandBR", "smoking_dichotom", "Delivery_Mode_dichotom", "Maternal_PrepregnancyBMI18oct28new", "Birth_Weight","Birth_Length", "Head_Circumference_at_Birth","Parity_dichotom",  "inducedlabour", "maternal_diabetes_dichotom", "maternal_hypertension_dichotom", "Maternal_Mental_Disorders_By_Childbirth")]

data frame without missings

Reg_Input_Data_Placenta_PREDO_EAAR_noNa_n <- na.omit(Reg_Input_Data_Placenta_PREDO_EAAR_n) 
dim(Reg_Input_Data_Placenta_PREDO_EAAR_noNa_n)
[1] 117  14
Reg_Input_Data_Placenta_PREDO_EAAR_noNa_wa <- na.omit(Reg_Input_Data_Placenta_PREDO_EAAR_wa) 
dim(Reg_Input_Data_Placenta_PREDO_EAAR_noNa_wa)
[1] 106  15
Reg_Input_Data_Placenta_male_PREDO_EAAR_noNa_n <- na.omit(Reg_Input_Data_Placenta_male_PREDO_EAAR_n) 
dim(Reg_Input_Data_Placenta_male_PREDO_EAAR_noNa_n)
[1] 56 14
Reg_Input_Data_Placenta_male_PREDO_EAAR_noNa_wa <- na.omit(Reg_Input_Data_Placenta_male_PREDO_EAAR_wa) 
dim(Reg_Input_Data_Placenta_male_PREDO_EAAR_noNa_wa)
[1] 52 15
Reg_Input_Data_Placenta_female_PREDO_EAAR_noNa_n <- na.omit(Reg_Input_Data_Placenta_female_PREDO_EAAR_n) 
dim(Reg_Input_Data_Placenta_female_PREDO_EAAR_noNa_n)
[1] 61 14
Reg_Input_Data_Placenta_female_PREDO_EAAR_noNa_wa <- na.omit(Reg_Input_Data_Placenta_female_PREDO_EAAR_wa) 
dim(Reg_Input_Data_Placenta_female_PREDO_EAAR_noNa_wa)
[1] 54 15
skimr::skim(Reg_Input_Data_Placenta_PREDO_EAAR_noNa_n)
── Data Summary ────────────────────────
                           Values                      
Name                       Reg_Input_Data_Placenta_P...
Number of rows             117                         
Number of columns          14                          
_______________________                                
Column type frequency:                                 
  factor                   8                           
  numeric                  6                           
________________________                               
Group variables            None                        

── Variable type: factor ────────────────────────────────────────────────────────────────────────────────────────────────────
  skim_variable                           n_missing complete_rate ordered n_unique top_counts      
1 Child_Sex                                       0             1 FALSE          2 fem: 61, mal: 56
2 smoking_dichotom                                0             1 FALSE          2 no: 107, yes: 10
3 Delivery_Mode_dichotom                          0             1 FALSE          2 una: 73, aid: 44
4 Parity_dichotom                                 0             1 FALSE          2 giv: 65, no : 52
5 inducedlabour                                   0             1 FALSE          2 No: 93, Yes: 24 
6 maternal_diabetes_dichotom                      0             1 FALSE          2 no : 98, dia: 19
7 maternal_hypertension_dichotom                  0             1 FALSE          2 no : 90, hyp: 27
8 Maternal_Mental_Disorders_By_Childbirth         0             1 FALSE          2 No: 103, Yes: 14

── Variable type: numeric ───────────────────────────────────────────────────────────────────────────────────────────────────
  skim_variable                      n_missing complete_rate      mean      sd      p0      p25       p50      p75    p100
1 EAAR_Lee                                   0             1   -0.0148   0.894   -2.86   -0.467    0.0580    0.597    2.39
2 Maternal_Age_18PopRegandBR                 0             1   32.1      4.67    22.3    28.7     31.8      35.3     43.4 
3 Maternal_PrepregnancyBMI18oct28new         0             1   25.0      5.74    17.7    21.0     23.4      26.6     46.5 
4 Birth_Weight                               0             1 3453.     533.    1100    3140     3525      3800     4810   
5 Birth_Length                               0             1   49.7      2.57    35      49       50        51       55   
6 Head_Circumference_at_Birth                0             1   35.2      1.38    31      34       35        36       38.5 
  hist 
1 ▁▃▇▆▁
2 ▃▆▇▅▂
3 ▇▆▁▁▁
4 ▁▁▅▇▂
5 ▁▁▂▇▂
6 ▁▅▇▇▁
save(Reg_Input_Data_Placenta_PREDO_EAAR_noNa_wa, file="InputData/ClockCalculationsInput/Reg_Input_Data_Placenta_PREDO_EAAR_noNa_wa.Rdata")
save(Reg_Input_Data_Placenta_PREDO_EAAR_noNa_n, file="InputData/ClockCalculationsInput/Reg_Input_Data_Placenta_PREDO_EAAR_noNa_n.Rdata")
save(Reg_Input_Data_Placenta_male_PREDO_EAAR_noNa_wa, file="InputData/ClockCalculationsInput/Reg_Input_Data_Placenta_male_PREDO_EAAR_noNa_wa.Rdata")
save(Reg_Input_Data_Placenta_male_PREDO_EAAR_noNa_n, file="InputData/ClockCalculationsInput/Reg_Input_Data_Placenta_male_PREDO_EAAR_noNa_n.Rdata")

save(Reg_Input_Data_Placenta_female_PREDO_EAAR_noNa_wa, file="InputData/ClockCalculationsInput/Reg_Input_Data_Placenta_female_PREDO_EAAR_noNa_wa.Rdata")
save(Reg_Input_Data_Placenta_female_PREDO_EAAR_noNa_n, file="InputData/ClockCalculationsInput/Reg_Input_Data_Placenta_female_PREDO_EAAR_noNa_n.Rdata")

to the top


Sample visualization

Fig. 1

Venn_ITU <- euler(c("CVS"=264, "Placenta \n(fetal side)"=486, "Cord blood"=426, "CVS&Placenta \n(fetal side)"=86, "Placenta \n(fetal side)&Cord blood"=390, "CVS&Cord blood"=73, "CVS&Placenta \n(fetal side)&Cord blood"=66))

Venn_PREDO <- euler(c("Placenta \n(decidual \nside)"=139, "Cord \nblood \n(EPIC)"=149, "Cord blood (450K)"=795, "Placenta \n(decidual \nside)&Cord \nblood \n(EPIC)"=117))

plot(Venn_ITU, counts=TRUE, font=1, cex=2, alpha=0.5, fill=c("grey", "lightgrey", "darkgrey"), labels=F)
grid::grid.text("CVS \nn = 264", x=0.3, y=0.3, gp=gpar(col="black", fontsize=11, font="Arial")) #CVS
grid::grid.text("Placenta \n(fetal side)\nn = 486", x=0.6, y=0.2, gp=gpar(col="black", fontsize=11, font="Arial")) #placenta
grid::grid.text("Cord blood\nn = 426", x=0.5, y=0.8, gp=gpar(col="black", fontsize=11, font="Arial")) #cord
grid::grid.text("73", x=0.35, y=0.55, gp=gpar(col="black", fontsize=10, font="Arial")) #cvs cord
grid::grid.text("86", x=0.43, y=0.26, gp=gpar(col="black", fontsize=10, font="Arial")) #cvs placenta
grid::grid.text("390", x=0.6, y=0.5, gp=gpar(col="black", fontsize=10, font="Arial")) #cord placenta
grid::grid.text("66", x=0.43, y=0.45, gp=gpar(col="black", fontsize=10, font="Arial")) #all

plot(Venn_PREDO, counts=TRUE, font=1, cex=1, alpha=0.5, fill=c("grey", "lightgrey", "darkgrey"), labels=F)
grid::grid.text("Placenta\n(decidual side) \nn = 139", x=0.08, y=0.3, gp=gpar(col="black", fontsize=11, font="Arial")) # placenta
grid::grid.text("Cord blood\n(EPIC) \nn = 149", x=0.37, y=0.3, gp=gpar(col="black", fontsize=11, font="Arial")) # cord epic
grid::grid.text("Cord blood\n(450K) \nn = 795", x=0.72, y=0.5, gp=gpar(col="black", fontsize=11, font="Arial")) # cord 450k
grid::grid.text("117", x=0.23, y=0.3, gp=gpar(col="black", fontsize=10, font="Arial")) # overlap
```r
ifelse(!dir.exists(file.path(getwd(), \Results/\)), dir.create(file.path(getwd(), \Results/\)), FALSE)

<!-- rnb-source-end -->

<!-- rnb-output-begin eyJkYXRhIjoiWzFdIEZBTFNFXG4ifQ== -->

[1] FALSE




<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->



<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxuaWZlbHNlKCFkaXIuZXhpc3RzKGZpbGUucGF0aChnZXR3ZCgpLCBcXFJlc3VsdHMvRmlndXJlcy9cXCkpLCBkaXIuY3JlYXRlKGZpbGUucGF0aChnZXR3ZCgpLCBcXFJlc3VsdHMvRmlndXJlcy9cXCkpLCBGQUxTRSlcbmBgYFxuYGBgIn0= -->

```r
```r
ifelse(!dir.exists(file.path(getwd(), \Results/Figures/\)), dir.create(file.path(getwd(), \Results/Figures/\)), FALSE)

<!-- rnb-source-end -->

<!-- rnb-output-begin eyJkYXRhIjoiWzFdIEZBTFNFXG4ifQ== -->

[1] FALSE




<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->



<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxucG5nKGZpbGVuYW1lPVwiUmVzdWx0cy9GaWd1cmVzL0lUVV9zYW1wbGUucG5nXCIsIHdpZHRoPTIzMDAsIGhlaWdodD0xNTAwLCByZXM9MzAwKVxucGxvdChWZW5uX0lUVSwgY291bnRzPVRSVUUsIGZvbnQ9MSwgY2V4PTIsIGFscGhhPTAuNSwgZmlsbD1jKFwiZ3JleVwiLCBcImxpZ2h0Z3JleVwiLCBcImRhcmtncmV5XCIpLCBsYWJlbHM9RilcbmdyaWQ6OmdyaWQudGV4dChcIkNWUyBcXG5uID0gMjY0XCIsIHg9MC4zLCB5PTAuMywgZ3A9Z3Bhcihjb2w9XCJibGFja1wiLCBmb250c2l6ZT0xMSwgZm9udD1cIkFyaWFsXCIpKSAjQ1ZTXG5ncmlkOjpncmlkLnRleHQoXCJQbGFjZW50YSBcXG4oZmV0YWwgc2lkZSlcXG5uID0gNDg2XCIsIHg9MC42LCB5PTAuMiwgZ3A9Z3Bhcihjb2w9XCJibGFja1wiLCBmb250c2l6ZT0xMSwgZm9udD1cIkFyaWFsXCIpKSAjcGxhY2VudGFcbmdyaWQ6OmdyaWQudGV4dChcIkNvcmQgYmxvb2RcXG5uID0gNDI2XCIsIHg9MC41LCB5PTAuOCwgZ3A9Z3Bhcihjb2w9XCJibGFja1wiLCBmb250c2l6ZT0xMSwgZm9udD1cIkFyaWFsXCIpKSAjY29yZFxuZ3JpZDo6Z3JpZC50ZXh0KFwiNzNcIiwgeD0wLjM1LCB5PTAuNTUsIGdwPWdwYXIoY29sPVwiYmxhY2tcIiwgZm9udHNpemU9MTAsIGZvbnQ9XCJBcmlhbFwiKSkgI2N2cyBjb3JkXG5ncmlkOjpncmlkLnRleHQoXCI4NlwiLCB4PTAuNDMsIHk9MC4yNiwgZ3A9Z3Bhcihjb2w9XCJibGFja1wiLCBmb250c2l6ZT0xMCwgZm9udD1cIkFyaWFsXCIpKSAjY3ZzIHBsYWNlbnRhXG5ncmlkOjpncmlkLnRleHQoXCIzOTBcIiwgeD0wLjYsIHk9MC41LCBncD1ncGFyKGNvbD1cImJsYWNrXCIsIGZvbnRzaXplPTEwLCBmb250PVwiQXJpYWxcIikpICNjb3JkIHBsYWNlbnRhXG5ncmlkOjpncmlkLnRleHQoXCI2NlwiLCB4PTAuNDMsIHk9MC40NSwgZ3A9Z3Bhcihjb2w9XCJibGFja1wiLCBmb250c2l6ZT0xMCwgZm9udD1cIkFyaWFsXCIpKSAjYWxsXG5kZXYub2ZmKClcbmBgYCJ9 -->

```r
png(filename="Results/Figures/ITU_sample.png", width=2300, height=1500, res=300)
plot(Venn_ITU, counts=TRUE, font=1, cex=2, alpha=0.5, fill=c("grey", "lightgrey", "darkgrey"), labels=F)
grid::grid.text("CVS \nn = 264", x=0.3, y=0.3, gp=gpar(col="black", fontsize=11, font="Arial")) #CVS
grid::grid.text("Placenta \n(fetal side)\nn = 486", x=0.6, y=0.2, gp=gpar(col="black", fontsize=11, font="Arial")) #placenta
grid::grid.text("Cord blood\nn = 426", x=0.5, y=0.8, gp=gpar(col="black", fontsize=11, font="Arial")) #cord
grid::grid.text("73", x=0.35, y=0.55, gp=gpar(col="black", fontsize=10, font="Arial")) #cvs cord
grid::grid.text("86", x=0.43, y=0.26, gp=gpar(col="black", fontsize=10, font="Arial")) #cvs placenta
grid::grid.text("390", x=0.6, y=0.5, gp=gpar(col="black", fontsize=10, font="Arial")) #cord placenta
grid::grid.text("66", x=0.43, y=0.45, gp=gpar(col="black", fontsize=10, font="Arial")) #all
dev.off()
png(filename="Results/Figures/PREDO_sample.png", width=2300, height=1500, res=300)
plot(Venn_PREDO, counts=TRUE, font=1, cex=1, alpha=0.5, fill=c("grey", "lightgrey", "darkgrey"), labels=F)
grid::grid.text("Placenta\n(decidual side) \nn = 139", x=0.08, y=0.3, gp=gpar(col="black", fontsize=11, font="Arial")) # placenta
grid::grid.text("Cord blood\n(EPIC) \nn = 149", x=0.37, y=0.3, gp=gpar(col="black", fontsize=11, font="Arial")) # cord epic
grid::grid.text("Cord blood\n(450K) \nn = 795", x=0.72, y=0.5, gp=gpar(col="black", fontsize=11, font="Arial")) # cord 450k
grid::grid.text("117", x=0.23, y=0.3, gp=gpar(col="black", fontsize=10, font="Arial")) # overlap
dev.off()

ITU Descriptives

Table 1 & 2

ifelse(!dir.exists(file.path(getwd(), "Results/Figures/diffTissues")), dir.create(file.path(getwd(), "Results/Figures/diffTissues")), FALSE)

ITU CVS

Clock

knitr::kable(
  psych::describe(Data_CVS_ITU[ ,c("Gestational_Age_Weeks", "gestage_at_CVS_weeks","DNAmGA_Lee","delta_Lee","zdelta_Lee", "EAAR_Lee", "DNAmGA_Mayne","delta_Mayne","zdelta_Mayne","EAAR_Mayne")])
)

Cell types

knitr::kable(
  psych::describe(Data_CVS_ITU[ ,c("Trophoblasts", "Stromal", "Hofbauer", "Endothelial", "nRBC", "Syncytiotrophoblast")])
)

Data_cells_cvs_itu <- Data_CVS_ITU[ ,c("Trophoblasts", "Stromal", "Hofbauer", "Endothelial", "nRBC", "Syncytiotrophoblast")]

cells_cvs <- data.frame(psych::describe(Data_CVS_ITU[ ,c("Trophoblasts", "Stromal", "Hofbauer", "Endothelial", "nRBC", "Syncytiotrophoblast")]))
cells_cvs_ <- cells_cvs[ ,c("mean", "sd")]

plot_cells_cvs <- ggplot(cells_cvs, aes(x=as.factor(rownames(cells_cvs)), y=mean)) +
  geom_bar(position=position_dodge(), stat="identity", colour='black') +
  geom_errorbar(aes(ymin=mean-sd, ymax=mean+sd), width=.2,position=position_dodge(.9))+
  theme(axis.text.x = element_text(angle = 90, vjust = 0.5, hjust=1))+
  labs(x ="\nCVS (ITU)")

png(filename="Results/Figures/diffTissues/cvs_cells_itu.png", width=2300, height=1500, res=400)
plot_cells_cvs
dev.off()

predictors descriptive

```r
CVS_Preds_ITU <- Data_CVS_ITU[,c(\Child_Sex\, \Delivery_mode_dichotom\, \Induced_Labour\, \Parity_dichotom\, \Maternal_Hypertension_dichotom\, \Maternal_Diabetes_dichotom\, \Maternal_Mental_Disorders\, \smoking_dichotom\, \maternal_alcohol_use\, \Maternal_Age_Years\, \Maternal_Body_Mass_Index_in_Early_Pregnancy\, \Child_Birth_Weight\, \Child_Birth_Length\, \Child_Head_Circumference_At_Birth\)]
colnames(CVS_Preds_ITU) <- c(\child_sex\, \delivery_mode\, \induced_labor\, \parity\, \hypertension\, \diabetes\, \mental_disorders\, \smoking\, \alcohol\, \maternal_age\, \maternal_BMI\, \birth_weight\, \birth_length\, \head_circumference\)
CVS_Preds_ITU$group <- \ITU\

<!-- rnb-source-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->



<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuQ1ZTX1ByZWRzX0lUVSAlPiUgIFxuc2VsZWN0X2lmKGlzLmZhY3RvcikgJT4lIFxuSG1pc2M6OmRlc2NyaWJlKClcbmBgYCJ9 -->

```r
CVS_Preds_ITU %>%  
select_if(is.factor) %>% 
Hmisc::describe()
CVS_Preds_ITU %>%
select_if(is.numeric) %>% 
psych::describe()
  • model without alcohol
Reg_Input_Data_CVS_ITU_EAAR_n_noNa %>%
  select_if(is.factor) %>%
  Hmisc::describe()

Reg_Input_Data_CVS_ITU_EAAR_n_noNa %>%
  select_if(is.numeric) %>%
  Hmisc::describe()
  • model with alcohol
Reg_Input_Data_CVS_ITU_EAAR_wa_noNa %>%
  select_if(is.factor) %>%
  Hmisc::describe()

#alcohol use 14.3%
Reg_Input_Data_CVS_ITU_EAAR_wa_noNa %>%
  select_if(is.numeric) %>%
  Hmisc::describe()

ITU Cord blood

Clocks

knitr::kable(
psych::describe(Data_Cord_ITU[ ,c("Gestational_Age_Weeks","DNAmGA_Knight","delta_Knight","zdelta_Knight", "EAAR_Knight", "DNAmGA_Bohlin","delta_Bohlin","zdelta_Bohlin", "EAAR_Bohlin")])
)

cell types

knitr::kable(
  psych::describe(Data_Cord_ITU[ ,c("CD8T", "CD4T", "NK", "Bcell", "Mono", "Gran", "nRBC")])
)

Data_cells_cord <- Data_Cord_ITU[ ,c("Sample_Name", "CD8T", "CD4T", "NK", "Bcell", "Mono", "Gran", "nRBC")]

cells_cord <- data.frame(psych::describe(Data_Cord_ITU[ ,c("CD8T", "CD4T", "NK", "Bcell", "Mono", "Gran", "nRBC")]))
cells_cord <- cells_cord[ ,c("mean", "sd")]
rownames(cells_cord) <- c("CD8T", "CD46", "NK", "Bcell", "Monocytes", "Granulocytes", "nRBC")

plot_cells_cord <- ggplot(cells_cord, aes(x=as.factor(rownames(cells_cord)), y=mean)) +
  geom_bar(position=position_dodge(), stat="identity", colour='black') +
  geom_errorbar(aes(ymin=mean-sd, ymax=mean+sd), width=.2,position=position_dodge(.9))+
  labs(x ="\nCord blood (ITU)")+
  theme(axis.text.x = element_text(angle = 90, vjust = 0.5, hjust=1))

png(filename="Results/Figures/diffTissues/cord_cells_itu.png", width=2300, height=1500, res=400)
plot_cells_cord
dev.off()

predictors descriptive

```r
Cordblood_Preds_ITU <- Data_Cord_ITU[,c(\Child_Sex\, \Delivery_mode_dichotom\, \Induced_Labour\, \Parity_dichotom\, \Maternal_Hypertension_dichotom\, \Maternal_Diabetes_dichotom\, \Maternal_Mental_Disorders\, \smoking_dichotom\, \maternal_alcohol_use\, \Maternal_Age_Years\, \Maternal_Body_Mass_Index_in_Early_Pregnancy\, \Child_Birth_Weight\, \Child_Birth_Length\, \Child_Head_Circumference_At_Birth\)]
colnames(Cordblood_Preds_ITU) <- c(\child_sex\, \delivery_mode\, \induced_labor\, \parity\, \hypertension\, \diabetes\, \mental_disorders\, \smoking\, \alcohol\, \maternal_age\, \maternal_BMI\, \birth_weight\, \birth_length\, \head_circumference\)
Cordblood_Preds_ITU$group <- \ITU\

<!-- rnb-source-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->



<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuQ29yZGJsb29kX1ByZWRzX0lUVSAlPiUgIFxuc2VsZWN0X2lmKGlzLmZhY3RvcikgJT4lIFxuSG1pc2M6OmRlc2NyaWJlKClcbmBgYCJ9 -->

```r
Cordblood_Preds_ITU %>%  
select_if(is.factor) %>% 
Hmisc::describe()
Cordblood_Preds_ITU %>%  
select_if(is.numeric) %>% 
Hmisc::describe()
  • model without alcohol
Reg_Input_Data_Cord_ITU_EAAR_noNa_n %>%
  select_if(is.factor) %>%
  Hmisc::describe()

Reg_Input_Data_Cord_ITU_EAAR_noNa_n %>%
  select_if(is.numeric) %>%
  Hmisc::describe()
  • model with alcohol
Reg_Input_Data_Cord_ITU_EAAR_noNa_wa %>%
  select_if(is.factor) %>%
  Hmisc::describe()

Reg_Input_Data_Cord_ITU_EAAR_noNa_wa %>%
  select_if(is.numeric) %>%
  Hmisc::describe()

#10.4% maternal alcohol use

ITU Placenta

Clocks

knitr::kable(
psych::describe(Data_Placenta_ITU[ ,c("Gestational_Age_Weeks","DNAmGA_Lee","delta_Lee","zdelta_Lee", "EAAR_Lee", "DNAmGA_Mayne","delta_Mayne","zdelta_Mayne","EAAR_Mayne", "TimeDifferencePlacenta_birth_sampling")])
)

cell types

knitr::kable(
  psych::describe(Data_Placenta_ITU[ ,c("Trophoblasts", "Stromal", "Hofbauer", "Endothelial", "nRBC", "Syncytiotrophoblast")])
)

Data_cells_placenta_itu <- Data_Placenta_ITU[ ,c("Trophoblasts", "Stromal", "Hofbauer", "Endothelial", "nRBC", "Syncytiotrophoblast")]

cells_placenta <- data.frame(psych::describe(Data_Placenta_ITU[ ,c("Trophoblasts", "Stromal", "Hofbauer", "Endothelial", "nRBC", "Syncytiotrophoblast")]))
cells_placenta <- cells_placenta[ ,c("mean", "sd")]

plot_cells_placenta <- ggplot(cells_placenta, aes(x=as.factor(rownames(cells_placenta)), y=mean)) +
  geom_bar(position=position_dodge(), stat="identity", colour='black') +
  geom_errorbar(aes(ymin=mean-sd, ymax=mean+sd), width=.2,position=position_dodge(.9))+
  theme(axis.text.x = element_text(angle = 90, vjust = 0.5, hjust=1))+
  labs(x ="\nfetal Placenta (ITU)")

png(filename="Results/Figures/diffTissues/placenta_cells_itu.png", width=2300, height=1500, res=400)
plot_cells_placenta
dev.off()
plot_cells_placenta

predictors descriptive

```r
Placenta_Preds_ITU <- Data_Placenta_ITU[,c(\Child_Sex\, \Delivery_mode_dichotom\, \Induced_Labour\, \Parity_dichotom\, \Maternal_Hypertension_dichotom\, \Maternal_Diabetes_dichotom\, \Maternal_Mental_Disorders\, \smoking_dichotom\, \maternal_alcohol_use\, \Maternal_Age_Years\, \Maternal_Body_Mass_Index_in_Early_Pregnancy\, \Child_Birth_Weight\, \Child_Birth_Length\, \Child_Head_Circumference_At_Birth\)]
colnames(Placenta_Preds_ITU) <- c(\child_sex\, \delivery_mode\, \induced_labor\, \parity\, \hypertension\, \diabetes\, \mental_disorders\, \smoking\, \alcohol\, \maternal_age\, \maternal_BMI\, \birth_weight\, \birth_length\, \head_circumference\)
Placenta_Preds_ITU$group <- \ITU\

<!-- rnb-source-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->



<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuUGxhY2VudGFfUHJlZHNfSVRVICU+JSAgXG5zZWxlY3RfaWYoaXMuZmFjdG9yKSAlPiUgXG5IbWlzYzo6ZGVzY3JpYmUoKVxuYGBgIn0= -->

```r
Placenta_Preds_ITU %>%  
select_if(is.factor) %>% 
Hmisc::describe()
Placenta_Preds_ITU %>%  
select_if(is.numeric) %>% 
Hmisc::describe()
  • model without alcohol
Reg_Input_Data_Placenta_ITU_EAAR_noNa_n %>%
  select_if(is.factor) %>%
  Hmisc::describe()

Reg_Input_Data_Placenta_ITU_EAAR_noNa_n %>%
  select_if(is.numeric) %>%
  Hmisc::describe()
  • model with alcohol
Reg_Input_Data_Placenta_ITU_EAAR_noNa_wa %>%
  select_if(is.factor) %>%
  Hmisc::describe()

Reg_Input_Data_Placenta_ITU_EAAR_noNa_wa %>%
  select_if(is.numeric) %>%
  Hmisc::describe()

# alcohol use 10.2%

to the top

PREDO Descriptives

Cord blood EPIC

Clocks

knitr::kable(
  psych::describe(Data_PREDO_EPICcord[,c("Gestational_Age","DNAmGA_Knight","delta_Knight","zdelta_Knight", "EAAR_Knight","DNAmGA_Bohlin","delta_Bohlin","zdelta_Bohlin",  "EAAR_Bohlin")])
)

cell types

knitr::kable(
  psych::describe(Data_PREDO_EPICcord[ ,c("CD8T", "CD4T", "NK", "Bcell", "Mono", "Gran", "nRBC")])
)

Data_cells_cord_epic <- Data_PREDO_EPICcord[ ,c("Sample_Name", "CD8T", "CD4T", "NK", "Bcell", "Mono", "Gran", "nRBC")]
  

cells_cord_epic <- data.frame(psych::describe(Data_PREDO_EPICcord[ ,c("CD8T", "CD4T", "NK", "Bcell", "Mono", "Gran", "nRBC")]))
cells_cord_epic <- cells_cord_epic[ ,c("mean", "sd")]
rownames(cells_cord_epic) <- c("CD8T", "CD4T", "NK", "Bcell", "Monocytes", "Granulocytes", "nRBC")
  

plot_cells_cord_epic <- ggplot(cells_cord_epic, aes(x=as.factor(rownames(cells_cord_epic)), y=mean)) +
  geom_bar(position=position_dodge(), stat="identity", colour='black') +
  geom_errorbar(aes(ymin=mean-sd, ymax=mean+sd), width=.2,position=position_dodge(.9))+
  theme(axis.text.x = element_text(angle = 90, vjust = 0.5, hjust=1))+
  labs(x ="\nCord blood EPIC (PREDO)")

png(filename="Results/Figures/diffTissues/cordepic_cells_predo.png", width=2300, height=1500, res=400)
plot_cells_cord_epic
dev.off()
plot_cells_cord_epic

predictors descriptive

```r
Cordblood_Preds_PREDO <- Data_PREDO_EPICcord[,c(\Child_Sex\,\Delivery_Mode_dichotom\,\inducedlabour\,\Parity_dichotom\, \maternal_hypertension_dichotom\, \maternal_diabetes_dichotom\, \Maternal_Mental_Disorders_By_Childbirth\,\smoking_dichotom\,\Alcohol_Use_In_Early_Pregnancy_19Oct\,\Maternal_Age_18PopRegandBR\,   \Maternal_PrepregnancyBMI18oct28new\, \Birth_Weight\, \Birth_Length\, \Head_Circumference_at_Birth\)]
colnames(Cordblood_Preds_PREDO) <- c(\child_sex\, \delivery_mode\, \induced_labor\, \parity\, \hypertension\, \diabetes\, \mental_disorders\, \smoking\, \alcohol\, \maternal_age\, \maternal_BMI\, \birth_weight\, \birth_length\, \head_circumference\)
Cordblood_Preds_PREDO$group <- \PREDO\
levels(Cordblood_Preds_PREDO$induced_labor)[levels(Cordblood_Preds_PREDO$induced_labor)==\Yes\] <- \yes\
levels(Cordblood_Preds_PREDO$induced_labor)[levels(Cordblood_Preds_PREDO$induced_labor)==\No\] <- \no\
levels(Cordblood_Preds_PREDO$diabetes)[levels(Cordblood_Preds_PREDO$diabetes)==\no diabetes in current pregnancy\] <- \no diabetes this pregnancy\

<!-- rnb-source-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->



<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuQ29yZGJsb29kX1ByZWRzX1BSRURPICU+JSAgXG5zZWxlY3RfaWYoaXMuZmFjdG9yKSAlPiUgXG5IbWlzYzo6ZGVzY3JpYmUoKVxuYGBgIn0= -->

```r
Cordblood_Preds_PREDO %>%  
select_if(is.factor) %>% 
Hmisc::describe()
Cordblood_Preds_PREDO %>%
select_if(is.numeric) %>% 
psych::describe()

Cord blood 450K

Clocks

knitr::kable(
  psych::describe(Data_PREDO_450Kcord[ ,c("Gestational_Age","DNAmGA_Knight","delta_Knight","zdelta_Knight", "EAAR_Knight", "DNAmGA_Bohlin","delta_Bohlin","zdelta_Bohlin", "EAAR_Bohlin")])
)

cell types

knitr::kable(
  psych::describe(Data_PREDO_450Kcord[ ,c("CD8T", "CD4T", "NK", "Bcell", "Mono", "Gran", "nRBC")])
)

Data_cells_cord_450 <- Data_PREDO_450Kcord[ ,c("Sample_Name", "CD8T", "CD4T", "NK", "Bcell", "Mono", "Gran", "nRBC")]
  
cells_cord_450K <- data.frame(psych::describe(Data_PREDO_450Kcord[ ,c("CD8T", "CD4T", "NK", "Bcell", "Mono", "Gran", "nRBC")]))
cells_cord_450K <- cells_cord_450K[ ,c("mean", "sd")]
rownames(cells_cord_450K) <- c("CD8T", "CD4T", "NK", "Bcell", "Monocytes", "Granulocytes", "nRBC")
  
plot_cells_cord_450K <- ggplot(cells_cord_450K, aes(x=as.factor(rownames(cells_cord_450K)), y=mean)) +
  geom_bar(position=position_dodge(), stat="identity", colour='black') +
  geom_errorbar(aes(ymin=mean-sd, ymax=mean+sd), width=.2,position=position_dodge(.9))+
  theme(axis.text.x = element_text(angle = 90, vjust = 0.5, hjust=1))+
  labs(x ="\nCord blood 450K (PREDO)")

png(filename="Results/Figures/diffTissues/cord450k_cells_predo.png", width=2300, height=1500, res=400)
plot_cells_cord_450K
dev.off()
plot_cells_cord_450K

predictors descriptive

```r
Cordblood_Preds450K_PREDO <- Data_PREDO_450Kcord[,c(\Child_Sex\,\Delivery_Mode_dichotom\,\inducedlabour\,\Parity_dichotom\, \maternal_hypertension_dichotom\, \maternal_diabetes_dichotom\, \Maternal_Mental_Disorders_By_Childbirth\,\smoking_dichotom\,\Alcohol_Use_In_Early_Pregnancy_19Oct\,\Maternal_Age_18PopRegandBR\,   \Maternal_PrepregnancyBMI18oct28new\, \Birth_Weight\, \Birth_Length\, \Head_Circumference_at_Birth\)]
colnames(Cordblood_Preds450K_PREDO) <- c(\child_sex\, \delivery_mode\, \induced_labor\, \parity\, \hypertension\, \diabetes\, \mental_disorders\, \smoking\, \alcohol\, \maternal_age\, \maternal_BMI\, \birth_weight\, \birth_length\, \head_circumference\)
Cordblood_Preds450K_PREDO$group <- \PREDO\
levels(Cordblood_Preds450K_PREDO$induced_labor)[levels(Cordblood_Preds450K_PREDO$induced_labor)==\Yes\] <- \yes\
levels(Cordblood_Preds450K_PREDO$induced_labor)[levels(Cordblood_Preds450K_PREDO$induced_labor)==\No\] <- \no\
levels(Cordblood_Preds450K_PREDO$diabetes)[levels(Cordblood_Preds450K_PREDO$diabetes)==\no diabetes in current pregnancy\] <- \no diabetes this pregnancy\

<!-- rnb-source-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->



<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuQ29yZGJsb29kX1ByZWRzNDUwS19QUkVETyAlPiUgIFxuc2VsZWN0X2lmKGlzLmZhY3RvcikgJT4lIFxuSG1pc2M6OmRlc2NyaWJlKClcbmBgYCJ9 -->

```r
Cordblood_Preds450K_PREDO %>%  
select_if(is.factor) %>% 
Hmisc::describe()
Cordblood_Preds450K_PREDO %>%
select_if(is.numeric) %>% 
psych::describe()

Placenta EPIC

Clocks

knitr::kable(
  psych::describe(Data_PREDO_EPICplacenta[,c("Gestational_Age","DNAmGA_Lee","delta_Lee","zdelta_Lee", "EAAR_Lee", "DNAmGA_Mayne","delta_Mayne","zdelta_Mayne", "EAAR_Mayne")])
)

cell types

knitr::kable(
  psych::describe(Data_PREDO_EPICplacenta[ ,c("Trophoblasts", "Stromal", "Hofbauer", "Endothelial", "nRBC", "Syncytiotrophoblast")])
)

Data_cells_placenta_pred <- Data_PREDO_EPICplacenta[ ,c("Trophoblasts", "Stromal", "Hofbauer", "Endothelial", "nRBC", "Syncytiotrophoblast")]

cells_placenta_predo <- data.frame(psych::describe(Data_PREDO_EPICplacenta[ ,c("Trophoblasts", "Stromal", "Hofbauer", "Endothelial", "nRBC", "Syncytiotrophoblast")]))
cells_cvs <- cells_cvs[ ,c("mean", "sd")]

plot_cells_placenta_predo <- ggplot(cells_placenta_predo, aes(x=as.factor(rownames(cells_placenta_predo)), y=mean)) +
  geom_bar(position=position_dodge(), stat="identity", colour='black') +
  geom_errorbar(aes(ymin=mean-sd, ymax=mean+sd), width=.2,position=position_dodge(.9))+
  theme(axis.text.x = element_text(angle = 90, vjust = 0.5, hjust=1))+
  labs(x ="\ndecidual Placenta (PREDO)")

png(filename="Results/Figures/diffTissues/placenta_cells_predo.png", width=2300, height=1500, res=400)
plot_cells_placenta_predo
dev.off()
plot_cells_placenta_predo

predictors descriptive

```r
Placenta_Preds_PREDO <- Data_PREDO_EPICplacenta[,c(\Child_Sex\,\Delivery_Mode_dichotom\,\inducedlabour\,\Parity_dichotom\, \maternal_hypertension_dichotom\, \maternal_diabetes_dichotom\, \Maternal_Mental_Disorders_By_Childbirth\,\smoking_dichotom\,\Alcohol_Use_In_Early_Pregnancy_19Oct\,\Maternal_Age_18PopRegandBR\,   \Maternal_PrepregnancyBMI18oct28new\, \Birth_Weight\, \Birth_Length\, \Head_Circumference_at_Birth\)]
colnames(Placenta_Preds_PREDO) <- c(\child_sex\, \delivery_mode\, \induced_labor\, \parity\, \hypertension\, \diabetes\, \mental_disorders\, \smoking\, \alcohol\, \maternal_age\, \maternal_BMI\, \birth_weight\, \birth_length\, \head_circumference\)
Placenta_Preds_PREDO$group <- \PREDO\
levels(Placenta_Preds_PREDO$induced_labor)[levels(Placenta_Preds_PREDO$induced_labor)==\Yes\] <- \yes\
levels(Placenta_Preds_PREDO$induced_labor)[levels(Placenta_Preds_PREDO$induced_labor)==\No\] <- \no\
levels(Placenta_Preds_PREDO$diabetes)[levels(Placenta_Preds_PREDO$diabetes)==\no diabetes in current pregnancy\] <- \no diabetes this pregnancy\

<!-- rnb-source-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->



<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuUGxhY2VudGFfUHJlZHNfUFJFRE8gJT4lICBcbnNlbGVjdF9pZihpcy5mYWN0b3IpICU+JSBcbkhtaXNjOjpkZXNjcmliZSgpXG5gYGAifQ== -->

```r
Placenta_Preds_PREDO %>%  
select_if(is.factor) %>% 
Hmisc::describe()
Placenta_Preds_PREDO %>%
select_if(is.numeric) %>% 
psych::describe()
  • model without alcohol
Reg_Input_Data_Placenta_PREDO_EAAR_noNa_n %>%
  select_if(is.factor) %>%
  Hmisc::describe()

Reg_Input_Data_Placenta_PREDO_EAAR_noNa_n %>%
  select_if(is.numeric) %>%
  Hmisc::describe()
  • model with alcohol
Reg_Input_Data_Placenta_PREDO_EAAR_noNa_wa %>%
  select_if(is.factor) %>%
  Hmisc::describe()

Reg_Input_Data_Placenta_PREDO_EAAR_noNa_wa %>%
  select_if(is.numeric) %>%
  Hmisc::describe()

#12.3% maternal alcohol use

to the top

Cell Type Overview

Cell Type Overview ITU & PREDO

#grid.arrange(plot_cells_cord, plot_cells_cord_epic, plot_cells_cord_450K, ncol=3)

ggarrange(plot_cells_cord +
               theme(axis.ticks.y = element_blank(),
                     plot.margin = margin(r = 1) ), 
          plot_cells_cord_epic + 
               theme(axis.text.y = element_blank(),
                     axis.ticks.y = element_blank(),
                     axis.title.y = element_blank(),
                     plot.margin = margin(r = 1, l = 1) ), 
          plot_cells_cord_450K + 
               theme(axis.text.y = element_blank(),
                     axis.ticks.y = element_blank(),
                     axis.title.y = element_blank(),
                     plot.margin = margin(l = 1)  ),
          nrow = 1)

ggarrange(plot_cells_cvs +
               theme(axis.ticks.y = element_blank(),
                     plot.margin = margin(r = 1) ), 
          plot_cells_placenta + 
               theme(axis.text.y = element_blank(),
                     axis.ticks.y = element_blank(),
                     axis.title.y = element_blank(),
                     plot.margin = margin(r = 1, l = 1) ), 
          plot_cells_placenta_predo + 
               theme(axis.text.y = element_blank(),
                     axis.ticks.y = element_blank(),
                     axis.title.y = element_blank(),
                     plot.margin = margin(l = 1)  ),
          nrow = 1)

to the top

comparison PREDO & ITU in predictors

placenta

```r
Placenta_Preds <- rbind(Placenta_Preds_ITU, Placenta_Preds_PREDO)

<!-- rnb-source-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->


continuous predictors, t-test

<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxucGxhY2VudGFfcHJlZF90IDwtIFBsYWNlbnRhX1ByZWRzICU+JSBcbiAgc2VsZWN0X2lmKGlzLm51bWVyaWMpICU+JVxuICBtYXBfZGYofiBicm9vbTo6dGlkeSh0LnRlc3QoLiB+IFBsYWNlbnRhX1ByZWRzJGdyb3VwKSksIC5pZCA9ICd2YXInKVxuXG5wbGFjZW50YV9wcmVkX3QgXG5gYGAifQ== -->

```r
placenta_pred_t <- Placenta_Preds %>% 
  select_if(is.numeric) %>%
  map_df(~ broom::tidy(t.test(. ~ Placenta_Preds$group)), .id = 'var')

placenta_pred_t 
t.test(maternal_age ~ group, data=Placenta_Preds)$estimate
t.test(maternal_BMI ~ group, data=Placenta_Preds)$estimate
t.test(birth_weight ~ group, data=Placenta_Preds)$estimate
t.test(birth_length ~ group, data=Placenta_Preds)$estimate
p.adjust(placenta_pred_t$p.value, method = "bonferroni", n = 15)

categorical

placenta_pred_chi <- Placenta_Preds %>% 
  select_if(is.factor) %>%
  map_df(~ broom::tidy(chisq.test(. ,Placenta_Preds$group, correct=F)), .id = 'var')

placenta_pred_chi
p.adjust(placenta_pred_chi$p.value, method = "bonferroni", n = 15)
table(Placenta_Preds$delivery_mode, Placenta_Preds$group)
table(Placenta_Preds$hypertension, Placenta_Preds$group)
table(Placenta_Preds$diabetes, Placenta_Preds$group)
table(Placenta_Preds$smoking, Placenta_Preds$group)

cordblood EPIC

```r
Cordblood_Preds <- rbind(Cordblood_Preds_ITU, Cordblood_Preds_PREDO)

<!-- rnb-source-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->


continuous predictors, t-test

<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuY29yZGJsb29kX3ByZWRfdCA8LSBDb3JkYmxvb2RfUHJlZHMgJT4lIFxuICBzZWxlY3RfaWYoaXMubnVtZXJpYykgJT4lXG4gIG1hcF9kZih+IGJyb29tOjp0aWR5KHQudGVzdCguIH4gQ29yZGJsb29kX1ByZWRzJGdyb3VwKSksIC5pZCA9ICd2YXInKVxuXG5jb3JkYmxvb2RfcHJlZF90IFxuIyBtYXRlcm5hbCBhZ2UsIG1hdGVybmFsIEJNSVxuYGBgIn0= -->

```r
cordblood_pred_t <- Cordblood_Preds %>% 
  select_if(is.numeric) %>%
  map_df(~ broom::tidy(t.test(. ~ Cordblood_Preds$group)), .id = 'var')

cordblood_pred_t 
# maternal age, maternal BMI
t.test(maternal_age ~ group, data=Cordblood_Preds)$estimate
t.test(maternal_BMI ~ group, data=Cordblood_Preds)$estimate
p.adjust(cordblood_pred_t$p.value, method = "bonferroni", n = 15)
# only maternal age

categorical

cordblood_pred_chi <- Cordblood_Preds %>% 
  select_if(is.factor) %>%
  map_df(~ broom::tidy(chisq.test(. ,Cordblood_Preds$group, correct=F)), .id = 'var')

cordblood_pred_chi
# parity, hypertension, smoking
p.adjust(cordblood_pred_chi$p.value, method = "bonferroni", n = 15)
# only hypertension
table(Cordblood_Preds$delivery_mode, Cordblood_Preds$group)
table(Cordblood_Preds$hypertension, Cordblood_Preds$group)
table(Cordblood_Preds$diabetes, Cordblood_Preds$group)
table(Cordblood_Preds$smoking, Cordblood_Preds$group)

cordblood 450K

```r
Cordblood_Preds450K <- rbind(Cordblood_Preds_ITU, Cordblood_Preds450K_PREDO)

<!-- rnb-source-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->


continuous predictors, t-test

<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuY29yZGJsb29kX3ByZWQ0NTBLX3QgPC0gQ29yZGJsb29kX1ByZWRzNDUwSyAlPiUgXG4gIHNlbGVjdF9pZihpcy5udW1lcmljKSAlPiVcbiAgbWFwX2RmKH4gYnJvb206OnRpZHkodC50ZXN0KC4gfiBDb3JkYmxvb2RfUHJlZHM0NTBLJGdyb3VwKSksIC5pZCA9ICd2YXInKVxuXG5jb3JkYmxvb2RfcHJlZDQ1MEtfdCBcbiMgbWF0ZXJuYWwgYWdlIGFuZCBCTUlcbmBgYCJ9 -->

```r
cordblood_pred450K_t <- Cordblood_Preds450K %>% 
  select_if(is.numeric) %>%
  map_df(~ broom::tidy(t.test(. ~ Cordblood_Preds450K$group)), .id = 'var')

cordblood_pred450K_t 
# maternal age and BMI
t.test(maternal_age ~ group, data=Cordblood_Preds450K)$estimate
t.test(maternal_BMI ~ group, data=Cordblood_Preds450K)$estimate
p.adjust(cordblood_pred450K_t$p.value, method = "bonferroni", n = 15)

categorical

cordblood_pred450K_chi <- Cordblood_Preds450K %>% 
  select_if(is.factor) %>%
  map_df(~ broom::tidy(chisq.test(. ,Cordblood_Preds450K$group, correct=F)), .id = 'var')

cordblood_pred450K_chi
# parity, hypertension, diabetes, alcohol
p.adjust(cordblood_pred450K_chi$p.value, method = "bonferroni", n = 15)
# only parity, hypertension
table(Cordblood_Preds450K$parity, Cordblood_Preds450K$group)
table(Cordblood_Preds450K$hypertension, Cordblood_Preds450K$group)
table(Cordblood_Preds450K$diabetes, Cordblood_Preds450K$group)
table(Cordblood_Preds450K$alcohol, Cordblood_Preds450K$group)

to the top

Predictors correlations

Fig. 2

ITU: look at predictors, in full data (all persons)

ifelse(!dir.exists(file.path(getwd(), "Results/Figures/predictors_cors")), dir.create(file.path(getwd(), "Results/Figures/predictors_cors")), FALSE)
```r
Input_ITU_all <- Data_ITU_all[ ,!(names(Data_ITU_all) %in% c(\Sample_Name\, \PC1_ethnicity\, \PC2_ethnicity\))]
names(Input_ITU_all) <- c(\child sex\, \maternal age\, \maternal smooking\, \delivery mode\, \maternal BMI\, \birth weight\, \birth length\, \head circumference\, \Parity\, \induced labor\, \maternal hypertension\, \maternal diabetes\, \maternal mental disorders\, \maternal alcohol use\)

<!-- rnb-source-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->



<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxuSW5wdXRfTV9hbGwgPC0gbW9kZWwubWF0cml4KH4wKy4sIGRhdGE9SW5wdXRfSVRVX2FsbClcbmNvbG5hbWVzKElucHV0X01fYWxsKSA8LSBjKFxcbWFsZVxcLFxcZmVtYWxlXFwsIFxcbWF0ZXJuYWwgYWdlXFwsIFxcbWF0ZXJuYWwgc21va2luZ1xcLCBcXGRlbGl2ZXJ5IG1vZGVcXCwgXFxtYXRlcm5hbCBCTUlcXCwgXFxiaXJ0aCB3ZWlnaHRcXCwgXFxiaXJ0aCBsZW5ndGhcXCwgXFxoZWFkIGNpcmN1bWZlcmVuY2VcXCwgXFxwYXJpdHlcXCwgXFxpbmR1Y2VkIGxhYm9yXFwsIFxcbWF0ZXJuYWwgaHlwZXJ0ZW5zaW9uXFwsIFxcbWF0ZXJuYWwgZGlhYmV0ZXNcXCwgXFxtYXRlcm5hbCBtZW50YWwgZGlzb3JkZXJzXFwsIFxcbWF0ZXJuYWwgYWxjb2hvbCB1c2VcXClcbmBgYFxuYGBgIn0= -->

```r
```r
Input_M_all <- model.matrix(~0+., data=Input_ITU_all)
colnames(Input_M_all) <- c(\male\,\female\, \maternal age\, \maternal smoking\, \delivery mode\, \maternal BMI\, \birth weight\, \birth length\, \head circumference\, \parity\, \induced labor\, \maternal hypertension\, \maternal diabetes\, \maternal mental disorders\, \maternal alcohol use\)

<!-- rnb-source-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->



<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuSW5wdXRfTV9hbGwgJT4lXG4gIGNvcih1c2U9XCJwYWlyd2lzZS5jb21wbGV0ZS5vYnNcIikgJT4lIFxuICBjb3JycGxvdCh0eXBlPVwidXBwZXJcIiwgdGwuY29sPVwiYmxhY2tcIilcbmBgYCJ9 -->

```r
Input_M_all %>%
  cor(use="pairwise.complete.obs") %>% 
  corrplot(type="upper", tl.col="black")
png("Results/Figures/predictors_cors/ITU_all.png", width=1600, height= 1500, res=350)
Input_M_all %>%
  cor(use="pairwise.complete.obs") %>% 
  corrplot(type="upper", tl.col="black")
  theme(plot.margin=unit(c(-0.30,0,0,0), "null")) # remove margin around plot
dev.off()
corr.test(Input_ITU_all[6:8])

to the top

PREDO: look at predictors, in full data (all persons)

```r
Input_PREDO_EPIC_all <- Data_PREDO_EPIC_all[ ,!(names(Data_PREDO_EPIC_all) %in% c(\Sample_Name\, \PC1\, \PC2\))]
names(Input_PREDO_EPIC_all) <- c(\child sex\, \maternal age\, \maternal smooking\, \delivery mode\, \maternal BMI\, \birth weight\, \birth length\, \head circumference\, \parity\, \induced labor\, \maternal hypertension\, \maternal diabetes\, \maternal mental disorders\, \maternal alcohol use\)

<!-- rnb-source-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->



<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxuSW5wdXRfTV9QUkVET19FUElDX2FsbCA8LSBtb2RlbC5tYXRyaXgofjArLiwgZGF0YT1JbnB1dF9QUkVET19FUElDX2FsbClcbmNvbG5hbWVzKElucHV0X01fUFJFRE9fRVBJQ19hbGwpIDwtIGMoXFxtYWxlXFwsXFxmZW1hbGVcXCwgXFxtYXRlcm5hbCBhZ2VcXCwgXFxtYXRlcm5hbCBzbW9raW5nXFwsIFxcZGVsaXZlcnkgbW9kZVxcLCBcXG1hdGVybmFsIEJNSVxcLCBcXGJpcnRoIHdlaWdodFxcLCBcXGJpcnRoIGxlbmd0aFxcLCBcXGhlYWQgY2lyY3VtZmVyZW5jZVxcLCBcXHBhcml0eVxcLCBcXGluZHVjZWQgbGFib3JcXCwgXFxtYXRlcm5hbCBoeXBlcnRlbnNpb25cXCwgXFxtYXRlcm5hbCBkaWFiZXRlc1xcLCBcXG1hdGVybmFsIG1lbnRhbCBkaXNvcmRlcnNcXCwgXFxtYXRlcm5hbCBhbGNvaG9sIHVzZVxcKVxuYGBgXG5gYGAifQ== -->

```r
```r
Input_M_PREDO_EPIC_all <- model.matrix(~0+., data=Input_PREDO_EPIC_all)
colnames(Input_M_PREDO_EPIC_all) <- c(\male\,\female\, \maternal age\, \maternal smoking\, \delivery mode\, \maternal BMI\, \birth weight\, \birth length\, \head circumference\, \parity\, \induced labor\, \maternal hypertension\, \maternal diabetes\, \maternal mental disorders\, \maternal alcohol use\)

<!-- rnb-source-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->



<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuSW5wdXRfTV9QUkVET19FUElDX2FsbCAlPiVcbiAgY29yKHVzZT1cInBhaXJ3aXNlLmNvbXBsZXRlLm9ic1wiKSAlPiUgXG4gIGNvcnJwbG90KHR5cGU9XCJ1cHBlclwiLCB0bC5jb2w9XCJibGFja1wiKVxuYGBgIn0= -->

```r
Input_M_PREDO_EPIC_all %>%
  cor(use="pairwise.complete.obs") %>% 
  corrplot(type="upper", tl.col="black")
png("Results/Figures/predictors_cors/PREDO_EPIC_all.png", width=1600, height= 1500, res=350)
Input_M_PREDO_EPIC_all %>%
  cor(use="pairwise.complete.obs") %>% 
  corrplot(type="upper", tl.col="black")
dev.off()
# mar = c(0, 0, 0, 2)
corr.test(Input_PREDO_EPIC_all[6:8])

correlation DNAmGA-GA

Additional file 7, Table 2

ITU: gestational age epigenetic age correlation (separate for every tissue)

ifelse(!dir.exists(file.path(getwd(), "Results/Figures/corDNAmGAGA")), dir.create(file.path(getwd(), "Results/Figures/corDNAmGAGA")), FALSE)

CVS
Lee clock

cor.test(Data_CVS_ITU$DNAmGA_Lee, Data_CVS_ITU$gestage_at_CVS_weeks, method="pearson")


corCVSGA_Lee <- ggscatter(Data_CVS_ITU, x = "gestage_at_CVS_weeks", y = "DNAmGA_Lee", 
          add = "reg.line", conf.int = TRUE, 
          cor.coef = TRUE, cor.method = "pearson",
          xlab = "gestational age at sampling (weeks)", ylab = "predicted gestational age from DNAm (weeks)", title="CVS", subtitle="Lee clock")

plotCVSGA_Lee <- ggplot(Data_CVS_ITU, aes(x =gestage_at_CVS_weeks, y =DNAmGA_Lee))+ 
  geom_point(shape=1)+
  xlab("gestational age at sampling (weeks)")+
  ylab("predicted gestational age from DNAm (weeks)")+
  geom_abline(intercept = 0, slope = 1)+
  ggtitle("CVS \nLee clock")

grid.arrange(corCVSGA_Lee, plotCVSGA_Lee, ncol=2)

tiff("Results/Figures/corDNAmGAGA/DNAmGAGA_cor_Lee_CVS_ITU.tiff", units="in", width=8, height=5, res=300)
corCVSGA_Lee
dev.off()

tiff("Results/Figures/corDNAmGAGA/DNAmGAGA_plot_Lee_CVS_ITU.tiff", units="in", width=8, height=5, res=300)
plotCVSGA_Lee
dev.off()

Mayne clock:

cor.test(Data_CVS_ITU$DNAmGA_Mayne, Data_CVS_ITU$gestage_at_CVS_weeks, method="pearson")

corCVSGA_Mayne <- ggscatter(Data_CVS_ITU, x = "gestage_at_CVS_weeks", y = "DNAmGA_Mayne", 
          add = "reg.line", conf.int = TRUE, 
          cor.coef = TRUE, cor.method = "pearson",
          xlab = "gestational age at sampling (weeks)", ylab = "predicted gestational age from DNAm (weeks)", title=" CVS", subtitle="Mayne clock")

plotCVSGA_Mayne <- ggplot(Data_CVS_ITU, aes(x =gestage_at_CVS_weeks, y =DNAmGA_Mayne))+ 
  geom_point(shape=1)+
  xlab("gestational age at sampling (weeks)")+
  ylab("predicted gestational age from DNAm (weeks)")+
  geom_abline(intercept = 0, slope = 1)+
  ggtitle("CVS \nMayne clock")

grid.arrange(corCVSGA_Mayne, plotCVSGA_Mayne, ncol=2)

tiff("Results/Figures/corDNAmGAGA/DNAmGAGA_cor_Mayne_CVS_ITU.tiff", units="in", width=8, height=5, res=300)
corCVSGA_Mayne
dev.off()

tiff("Results/Figures/corDNAmGAGA/DNAmGAGA_plot_Mayne_CVS_ITU.tiff", units="in", width=8, height=5, res=300)
plotCVSGA_Mayne
dev.off()

Cordblood
Knight clock

cor.test(Data_Cord_ITU$DNAmGA_Knight, Data_Cord_ITU$Gestational_Age_Weeks, method="pearson")

corCordGA_Knight <- ggscatter(Data_Cord_ITU, x = "Gestational_Age_Weeks", y = "DNAmGA_Knight", 
          add = "reg.line", conf.int = TRUE, 
          cor.coef = TRUE, cor.method = "pearson",
          xlab = "gestational age at birth (weeks)", ylab = "predicted gestational age from DNAm (weeks)", title="Cordblood", subtitle="Knight clock")

plotCordGA_Knight <- ggplot(Data_Cord_ITU, aes(x =Gestational_Age_Weeks, y =DNAmGA_Knight))+ 
  geom_point(shape=1)+
  xlab("gestational age at birth (weeks)")+
  ylab("predicted gestational age from DNAm (weeks)")+
  geom_abline(intercept = 0, slope = 1)+
  ggtitle("Cordblood \nKnight clock")

grid.arrange(corCordGA_Knight, plotCordGA_Knight, ncol=2)

tiff("Results/Figures/corDNAmGAGA/DNAmGAGA_cor_Cord_Knight_ITU.tiff", units="in", width=8, height=5, res=300)
corCordGA_Knight
dev.off()

tiff("Results/Figures/corDNAmGAGA/DNAmGAGA_plot_Cord_Knight_ITU.tiff", units="in", width=8, height=5, res=300)
plotCordGA_Knight
dev.off()

## Knight Testing Data set correlation: r=0.91; individual test sets r=0.52 & 0.65)
## Girchenko correlation r=0.51
## Palma-Gudiel: r=0.76
## Suarez: r=.0.52

Bohlin Clock

cor.test(Data_Cord_ITU$DNAmGA_Bohlin, Data_Cord_ITU$Gestational_Age_Weeks, method="pearson")

corCordGA_Bohlin <- ggscatter(Data_Cord_ITU, x = "Gestational_Age_Weeks", y = "DNAmGA_Bohlin", 
          add = "reg.line", conf.int = TRUE, 
          cor.coef = TRUE, cor.method = "pearson",
          xlab = "gestational age at birth (weeks)", ylab = "predicted gestational age from DNAm (weeks)", title="Cordblood", subtitle="Bohlin clock")

plotCordGA_Bohlin <- ggplot(Data_Cord_ITU, aes(x = Gestational_Age_Weeks, y =DNAmGA_Bohlin))+ 
  geom_point(shape=1)+
  xlab("gestational age at birth (weeks)")+
  ylab("predicted gestational age from DNAm (weeks)")+
  geom_abline(intercept = 0, slope = 1)+
  ggtitle("Cordblood \nBohlin clock")

grid.arrange(corCordGA_Bohlin, plotCordGA_Bohlin, ncol=2)

tiff("Results/Figures/corDNAmGAGA/DNAmGAGA_cor_Cord_Bohlin_ITU.tiff", units="in", width=8, height=5, res=300)
corCordGA_Bohlin
dev.off()

tiff("Results/Figures/corDNAmGAGA/DNAmGAGA_plot_Cord_Bohlin_ITU.tiff", units="in", width=8, height=5, res=300)
plotCordGA_Bohlin
dev.off()

## Simpkin correlation in ALSPAC r=0.65

Placenta
Lee Clock

cor.test(Data_Placenta_ITU$DNAmGA_Lee, Data_Placenta_ITU$Gestational_Age_Weeks, method="pearson")

corPlacentaGA_Lee <- ggscatter(Data_Placenta_ITU, x = "Gestational_Age_Weeks", y = "DNAmGA_Lee", 
          add = "reg.line", conf.int = TRUE, 
          cor.coef = TRUE, cor.method = "pearson",
          xlab = "gestational age at birth (weeks)", ylab = "predicted gestational age from DNAm (weeks)", title="Placenta", subtitle="Lee clock")

plotPlacentaGA_Lee <- ggplot(Data_Placenta_ITU, aes(x =Gestational_Age_Weeks, y=DNAmGA_Lee))+ 
  geom_point(shape=1)+
  xlab("gestational age at birth (weeks)")+
  ylab("predicted gestational age from DNAm (weeks)")+
  geom_abline(intercept = 0, slope = 1)+
  ggtitle("Placenta \nLee clock")

grid.arrange(corPlacentaGA_Lee, plotPlacentaGA_Lee, ncol=2)

tiff("Results/Figures/corDNAmGAGA/DNAmGAGA_cor_Placenta_Lee_ITU.tiff", units="in", width=8, height=5, res=300)
corPlacentaGA_Lee
dev.off()

tiff("Results/Figures/corDNAmGAGA/DNAmGAGA_plot_Placenta_Lee_ITU.tiff", units="in", width=8, height=5, res=300)
plotPlacentaGA_Lee
dev.off()

Mayne Clock

cor.test(Data_Placenta_ITU$DNAmGA_Mayne, Data_Placenta_ITU$Gestational_Age_Weeks, method="pearson")

corPlacentaGA_Mayne <- ggscatter(Data_Placenta_ITU, x = "Gestational_Age_Weeks", y = "DNAmGA_Mayne", 
          add = "reg.line", conf.int = TRUE, 
          cor.coef = TRUE, cor.method = "pearson",
          xlab = "gestational age at birth (weeks)", ylab = "predicted gestational age from DNAm (weeks)", title="Placenta", subtitle="Mayne clock")

plotPlacentaGA_Mayne <- ggplot(Data_Placenta_ITU, aes(x =Gestational_Age_Weeks, y =DNAmGA_Mayne))+ 
  geom_point(shape=1)+
  xlab("gestational age at birth (weeks)")+
  ylab("predicted gestational age from DNAm (weeks)")+
  geom_abline(intercept = 0, slope = 1)+
  ggtitle("Placenta \nMayne")

grid.arrange(corPlacentaGA_Mayne, plotPlacentaGA_Mayne, ncol=2)

tiff("Results/Figures/corDNAmGAGA/DNAmGAGA_cor_Placenta_Mayne_ITU.tiff", units="in", width=8, height=5, res=300)
corPlacentaGA_Mayne
dev.off()

tiff("Results/Figures/corDNAmGAGA/DNAmGAGA_plot_Placenta_Mayne_ITU.tiff", units="in", width=8, height=5, res=300)
plotPlacentaGA_Mayne 
dev.off()

to the top

PREDO: gestational age epigenetic age correlation (separate for every tissue)

450K Cordblood Knight with the full estimator, Knight

cor.test(Data_PREDO_450Kcord$DNAmGA_Knight, Data_PREDO_450Kcord$Gestational_Age, method="pearson")

corCord_Knight_P450 <- ggscatter(Data_PREDO_450Kcord, x = "Gestational_Age", y = "DNAmGA_Knight", 
          add = "reg.line", conf.int = TRUE, 
          cor.coef = TRUE, cor.method = "pearson",
          xlab = "gestational age at sampling (weeks)", ylab = "predicted gestational age from DNAm (weeks)", title="Cordblood (450K)", subtitle="Knight clock")

plotCord_Knight_P450 <- ggplot(Data_PREDO_450Kcord, aes(x =Gestational_Age, y =DNAmGA_Knight))+ 
  geom_point(shape=1)+
  xlab("gestational age at sampling (weeks)")+
  ylab("predicted gestational age from DNAm (weeks)")+
  geom_abline(intercept = 0, slope = 1)+
  ggtitle("Cordblood (450K) \nKnight clock")

grid.arrange(corCord_Knight_P450, plotCord_Knight_P450, ncol=2)

tiff("Results/Figures/corDNAmGAGA/DNAmGAGA_cor_Cord450K_Knight_PREDO.tiff", units="in", width=8, height=5, res=300)
corCord_Knight_P450
dev.off()

tiff("Results/Figures/corDNAmGAGA/DNAmGAGA_plot_Cord450K_Knight_PREDO.tiff", units="in", width=8, height=5, res=300)
plotCord_Knight_P450 
dev.off()
#Data_PREDO_450Kcord[which.min(Data_PREDO_450Kcord$Gestational_Age),] #(visual) outlier, row 70
# exclude this outlier to see what correlation would be then
cor.test(Data_PREDO_450Kcord$DNAmGA_Knight[-70], Data_PREDO_450Kcord$Gestational_Age[-70], method="pearson")

Data_PREDO_450Kcord_outout <- Data_PREDO_450Kcord[-70, ]
ggscatter(Data_PREDO_450Kcord_outout, x = "Gestational_Age", y = "DNAmGA_Knight", 
         add = "reg.line", conf.int = TRUE, 
         cor.coef = TRUE, cor.method = "pearson",
         xlab = "gestational age at sampling (weeks)", ylab = "predicted gestational age from DNAm (weeks)", title="Cordblood (450K)", subtitle="with outlier removed")

Bohlin with the full estimator

cor.test(Data_PREDO_450Kcord$DNAmGA_Bohlin, Data_PREDO_450Kcord$Gestational_Age, method="pearson")

corCord_Bohlin_P450 <- ggscatter(Data_PREDO_450Kcord, x = "Gestational_Age", y = "DNAmGA_Bohlin", 
          add = "reg.line", conf.int = TRUE, 
          cor.coef = TRUE, cor.method = "pearson",
          xlab = "gestational age at sampling (weeks)", ylab = "predicted gestational age from DNAm (weeks)", title="Cordblood (450K)", subtitle="Bohlin clock")

plotCord_Bohlin_P450 <- ggplot(Data_PREDO_450Kcord, aes(x =Gestational_Age, y =DNAmGA_Bohlin))+ 
  geom_point(shape=1)+
  xlab("gestational age at sampling (weeks)")+
  ylab("predicted gestational age from DNAm (weeks)")+
  geom_abline(intercept = 0, slope = 1)+
  ggtitle("Cordblood (450K) \nBohlin")

grid.arrange(corCord_Bohlin_P450, plotCord_Bohlin_P450, ncol=2)

tiff("Results/Figures/corDNAmGAGA/DNAmGAGA_cor_Cord450K_Bohlin_PREDO.tiff", units="in", width=10, height=5, res=300)
corCord_Bohlin_P450
dev.off()

tiff("Results/Figures/corDNAmGAGA/DNAmGAGA_plot_Cord450K_Bohlin_PREDO.tiff", units="in", width=10, height=5, res=300)
plotCord_Bohlin_P450
dev.off()

EPIC Cordblood
Knight

cor.test(Data_PREDO_EPICcord$DNAmGA_Knight, Data_PREDO_EPICcord$Gestational_Age, method="pearson")

corCord_Knight_P <- ggscatter(Data_PREDO_EPICcord, x = "Gestational_Age", y = "DNAmGA_Knight", 
          add = "reg.line", conf.int = TRUE, 
          cor.coef = TRUE, cor.method = "pearson",
          xlab = "gestational age at sampling (weeks)", ylab = "predicted gestational age from DNAm (weeks)", title="Cordblood (EPIC)", subtitle="Knight clock")

plotCord_Knight_P <- ggplot(Data_PREDO_EPICcord, aes(x =Gestational_Age, y =DNAmGA_Knight))+ 
  geom_point(shape=1)+
  xlab("gestational age at sampling (weeks)")+
  ylab("predicted gestational age from DNAm (weeks)")+
  geom_abline(intercept = 0, slope = 1)+
  ggtitle("Cordblood (EPIC) \nKnight clock")

grid.arrange(corCord_Knight_P, plotCord_Knight_P, ncol=2)

tiff("Results/Figures/corDNAmGAGA/DNAmGAGA_cor_Cord_Knight_PREDO.tiff", units="in", width=10, height=5, res=300)
corCord_Knight_P
dev.off()

tiff("Results/Figures/corDNAmGAGA/DNAmGAGA_plot_Cord_Knight_PREDO.tiff", units="in", width=10, height=5, res=300)
plotCord_Knight_P
dev.off()

Bohlin:

cor.test(Data_PREDO_EPICcord$DNAmGA_Bohlin, Data_PREDO_EPICcord$Gestational_Age, method="pearson")

corCord_Bohlin_P <- ggscatter(Data_PREDO_EPICcord, x = "Gestational_Age", y = "DNAmGA_Bohlin", 
          add = "reg.line", conf.int = TRUE, 
          cor.coef = TRUE, cor.method = "pearson",
          xlab = "gestational age at sampling (weeks)", ylab = "predicted gestational age from DNAm (weeks)", title="Cordblood (EPIC)", subtitle="Bohlin clock")

plotCord_Bohlin_P <- ggplot(Data_PREDO_EPICcord, aes(x =Gestational_Age, y =DNAmGA_Bohlin))+ 
  geom_point(shape=1)+
  xlab("gestational age at sampling (weeks)")+
  ylab("predicted gestational age from DNAm (weeks)")+
  geom_abline(intercept = 0, slope = 1)+
  ggtitle("Cordblood (EPIC) \nBohlin")

grid.arrange(corCord_Bohlin_P, plotCord_Bohlin_P, ncol=2)

tiff("Results/Figures/corDNAmGAGA/DNAmGAGA_cor_Cord_Bohlin_PREDO.tiff", units="in", width=10, height=5, res=300)
corCord_Bohlin_P
dev.off()

tiff("Results/Figures/corDNAmGAGA/DNAmGAGA_plot_Cord_Bohlin_PREDO.tiff", units="in", width=10, height=5, res=300)
plotCord_Bohlin_P
dev.off()

EPIC Placenta
Lee

cor.test(Data_PREDO_EPICplacenta$DNAmGA_Lee, Data_PREDO_EPICplacenta$Gestational_Age, method="pearson")

corPlacenta_Lee_P <- ggscatter(Data_PREDO_EPICplacenta, x = "Gestational_Age", y = "DNAmGA_Lee", 
          add = "reg.line", conf.int = TRUE, 
          cor.coef = TRUE, cor.method = "pearson",
          xlab = "gestational age at sampling (weeks)", ylab = "predicted gestational age from DNAm (weeks)", title="Placenta (EPIC)", subtitle="Lee clock")

plotPlacenta_Lee_P <- ggplot(Data_PREDO_EPICplacenta, aes(x =Gestational_Age, y =DNAmGA_Lee))+ 
  geom_point(shape=1)+
  xlab("gestational age at sampling (weeks)")+
  ylab("predicted gestational age from DNAm (weeks)")+
  geom_abline(intercept = 0, slope = 1)+
  ggtitle("Placenta (EPIC) \nLee clock")

grid.arrange(corPlacenta_Lee_P, plotPlacenta_Lee_P, ncol=2)

tiff("Results/Figures/corDNAmGAGA/DNAmGAGA_cor_Placenta_Lee_PREDO.tiff", units="in", width=10, height=5, res=300)
corPlacenta_Lee_P
dev.off()

tiff("Results/Figures/corDNAmGAGA/DNAmGAGA_plot_Placenta_Lee_PREDO.tiff", units="in", width=10, height=5, res=300)
plotPlacenta_Lee_P
dev.off()

Mayne

cor.test(Data_PREDO_EPICplacenta$DNAmGA_Mayne, Data_PREDO_EPICplacenta$Gestational_Age, method="pearson")

corPlacenta_Mayne_P <- ggscatter(Data_PREDO_EPICplacenta, x = "Gestational_Age", y = "DNAmGA_Mayne", 
          add = "reg.line", conf.int = TRUE, 
          cor.coef = TRUE, cor.method = "pearson",
          xlab = "gestational age at sampling (weeks)", ylab = "predicted gestational age from DNAm (weeks)", title="Placenta (EPIC)", subtitle="Mayne clock")

plotPlacenta_Mayne_P <- ggplot(Data_PREDO_EPICplacenta, aes(x =Gestational_Age, y =DNAmGA_Mayne))+ 
  geom_point(shape=1)+
  xlab("gestational age at sampling (weeks)")+
  ylab("predicted gestational age from DNAm (weeks)")+
  geom_abline(intercept = 0, slope = 1)+
  ggtitle("Placenta (EPIC) \nMayne")

grid.arrange(corPlacenta_Mayne_P, plotPlacenta_Mayne_P, ncol=2)

tiff("Results/Figures/corDNAmGAGA/DNAmGAGA_cor_Placenta_Mayne_PREDO.tiff", units="in", width=10, height=5, res=300)
corPlacenta_Mayne_P
dev.off()

tiff("Results/Figures/corDNAmGAGA/DNAmGAGA_plot_Placenta_Mayne_PREDO.tiff", units="in", width=10, height=5, res=300)
plotPlacenta_Mayne_P
dev.off()

to the top

DNAmGA GA correlation plots

for Additional File 7

cor_bohlin_itu <- ggscatter(Data_Cord_ITU, x = "Gestational_Age_Weeks", y = "DNAmGA_Bohlin", 
          add = "reg.line", conf.int = TRUE, 
         # cor.coef = TRUE, cor.method = "pearson",
          xlab = "Gestational Age (weeks)", ylab = "DNAmGA Bohlin (weeks)", subtitle="ITU (n=426)")+
   stat_cor(label.x = 28, label.y=43,p.accuracy = 0.001, r.accuracy = 0.01)+
  theme(axis.text.x = element_text(size=9), axis.text.y=element_text(size=9), axis.title.y = element_text(size=12), axis.title.x=element_blank(),
  panel.grid.major = element_blank(),
  panel.grid.minor = element_blank())+
  scale_y_continuous(limits = c(32,44), breaks = seq(32,44, by=2))+
 scale_x_continuous(limits = c(28,44), breaks = seq(28,44, by=2))


cor_bohlin_predo <- ggscatter(Data_PREDO_EPICcord, x = "Gestational_Age", y = "DNAmGA_Bohlin", 
          add = "reg.line", conf.int = TRUE, 
          #cor.coef = TRUE, cor.method = "pearson",
          xlab = "Gestational Age (weeks)", ylab = "DNAmGA Bohlin Clock (weeks)", subtitle="PREDO 450K (n=149)")+
   stat_cor(label.x = 30, label.y=43,p.accuracy = 0.001, r.accuracy = 0.01)+
  theme(axis.text.x = element_text(size=9), axis.text.y=element_text(size=9), axis.title.y = element_text(size=12), axis.title.x=element_blank(),
  panel.grid.major = element_blank(),
  panel.grid.minor = element_blank()) +
  scale_y_continuous(limits = c(32,44), breaks = seq(32,44, by=2))+
  scale_x_continuous(limits = c(30,44), breaks = seq(30,44, by=2))
  
cor_bohlin_predo_450k <- ggscatter(Data_PREDO_450Kcord, x = "Gestational_Age", y = "DNAmGA_Bohlin", 
          add = "reg.line", conf.int = TRUE, 
          #cor.coef = TRUE, cor.method = "pearson",
          xlab = "Gestational Age (weeks)", ylab = "DNAmGA Bohlin Clock (weeks)", subtitle="PREDO EPIC (n=793)")+
   stat_cor(label.x = 26, label.y=43,p.accuracy = 0.001, r.accuracy = 0.01)+
  theme(axis.text.x = element_text(size=9), axis.text.y=element_text(size=9), axis.title.y = element_text(size=12), axis.title.x=element_blank(),
  panel.grid.major = element_blank(),
  panel.grid.minor = element_blank()) +
  scale_y_continuous(limits = c(32,44), breaks = seq(32,44, by=2))+
  scale_x_continuous(limits = c(26,44), breaks = seq(26,44, by=2))

Bohlin_DNAmGA_GA <- ggarrange(
          cor_bohlin_itu +
           theme(plot.margin = margin(r = 0.2)),
          cor_bohlin_predo +
               theme(axis.text.y = element_blank(),
                     axis.ticks.y = element_blank(), axis.title.y = element_blank(), plot.margin = margin(r = 0.2, l = 0.2)),
          cor_bohlin_predo_450k +
               theme(axis.text.y = element_blank(),
                     axis.ticks.y = element_blank(), axis.title.y = element_blank(), plot.margin = margin(r = 0.2, l = 0.2)),
          nrow = 1,
          align = c("hv"))

# Annotate the figure by adding a common labels
annotate_figure(Bohlin_DNAmGA_GA,
                bottom = text_grob("Gestational Age (weeks)", size = 12))
png(file="Results/Figures/corDNAmGAGA/Bohlin.png", width= 3600, height=2100, res=480)
annotate_figure(Bohlin_DNAmGA_GA,
                bottom = text_grob("Gestational Age (weeks)", size = 12))
dev.off()
cor_knight_itu <- ggscatter(Data_Cord_ITU, x = "Gestational_Age_Weeks", y = "DNAmGA_Knight", 
          add = "reg.line", conf.int = TRUE, 
         # cor.coef = TRUE, cor.method = "pearson",
          xlab = "Gestational Age (weeks)", ylab = "DNAmGA Knight Clock (weeks)", subtitle="ITU (n=426)")+
   stat_cor(label.x = 28, label.y=48,p.accuracy = 0.001, r.accuracy = 0.01)+
  theme(axis.text.x = element_text(size=9), axis.text.y=element_text(size=9), axis.title.y = element_text(size=12), axis.title.x=element_blank(),
  panel.grid.major = element_blank(),
  panel.grid.minor = element_blank())+
  scale_y_continuous(limits = c(28,48), breaks = seq(28,48, by=2))+
 scale_x_continuous(limits = c(28,44), breaks = seq(28,44, by=2))


cor_knight_predo <- ggscatter(Data_PREDO_EPICcord, x = "Gestational_Age", y = "DNAmGA_Knight", 
          add = "reg.line", conf.int = TRUE, 
          #cor.coef = TRUE, cor.method = "pearson",
          xlab = "Gestational Age (weeks)", ylab = "DNAmGA Knight Clock (weeks)", subtitle="PREDO EPIC (n=149)")+
   stat_cor(label.x = 30, label.y=48,p.accuracy = 0.001, r.accuracy = 0.01)+
  theme(axis.text.x = element_text(size=9), axis.text.y=element_text(size=9), axis.title.y = element_text(size=12), axis.title.x=element_blank(),
  panel.grid.major = element_blank(),
  panel.grid.minor = element_blank()) +
  scale_y_continuous(limits = c(28,48), breaks = seq(28,48, by=2))+
  scale_x_continuous(limits = c(30,44), breaks = seq(30,44, by=2))
  
cor_knight_predo_450k <- ggscatter(Data_PREDO_450Kcord, x = "Gestational_Age", y = "DNAmGA_Knight", 
          add = "reg.line", conf.int = TRUE, 
          #cor.coef = TRUE, cor.method = "pearson",
          xlab = "Gestational Age (weeks)", ylab = "DNAmGA Knight Clock (weeks)", subtitle="PREDO 450K (n=793)")+
   stat_cor(label.x = 26, label.y=48,p.accuracy = 0.001, r.accuracy = 0.01)+
  theme(axis.text.x = element_text(size=9), axis.text.y=element_text(size=9), axis.title.y = element_text(size=12), axis.title.x=element_blank(),
  panel.grid.major = element_blank(),
  panel.grid.minor = element_blank()) +
  scale_y_continuous(limits = c(28,48), breaks = seq(28,48, by=2))+
  scale_x_continuous(limits = c(26,44), breaks = seq(26,44, by=2))

Knight_DNAmGA_GA <- ggarrange(
          cor_knight_itu +
           theme(legend.position="none", plot.margin = margin(r = 0.2) ),
          cor_knight_predo +
               theme(axis.text.y = element_blank(),
                     axis.ticks.y = element_blank(), axis.title.y = element_blank(), plot.margin = margin(r = 0.2, l = 0.2)),
          cor_knight_predo_450k +
               theme(axis.text.y = element_blank(),
                     axis.ticks.y = element_blank(), axis.title.y = element_blank(), plot.margin = margin(r = 0.2, l = 0.2)),
          nrow = 1,
          align = c("hv"))

# Annotate the figure by adding a common labels
annotate_figure(Knight_DNAmGA_GA,
                bottom = text_grob("Gestational Age (weeks)", size = 12))
png(file="Results/Figures/corDNAmGAGA/Knight.png", width= 3600, height=2100, res=480)
annotate_figure(Knight_DNAmGA_GA,
                bottom = text_grob("Gestational Age (weeks)", size = 12))
dev.off()
cor_mayne_itu_cvs <- ggscatter(Data_CVS_ITU, x = "gestage_at_CVS_weeks", y = "DNAmGA_Mayne", 
          add = "reg.line", conf.int = TRUE, 
         # cor.coef = TRUE, cor.method = "pearson",
          xlab = "Gestational Age (weeks)", ylab = "DNAmGA Mayne Clock (weeks)", subtitle="ITU CVS (n=264)")+
   stat_cor(label.x = 10, label.y=20,p.accuracy = 0.001, r.accuracy = 0.01)+
  theme(axis.text.x = element_text(size=9), axis.text.y=element_text(size=9), axis.title.y = element_text(size=12), axis.title.x=element_text(size=12),
  panel.grid.major = element_blank(),
  panel.grid.minor = element_blank())+
  scale_y_continuous(limits = c(4,20), breaks = seq(4,20, by=2))+
 scale_x_continuous(limits = c(10,16), breaks = seq(10,16, by=2))


cor_mayne_itu <- ggscatter(Data_Placenta_ITU, x = "Gestational_Age_Weeks", y = "DNAmGA_Mayne", 
          add = "reg.line", conf.int = TRUE, 
          #cor.coef = TRUE, cor.method = "pearson",
          xlab = "Gestational Age (weeks)", ylab = "DNAmGA Mayne Clock (weeks)", subtitle="ITU (n=486)")+
   stat_cor(label.x = 28, label.y=38,p.accuracy = 0.001, r.accuracy = 0.01)+
  theme(axis.text.x = element_text(size=9), axis.text.y=element_text(size=9), axis.title.y = element_text(size=12), axis.title.x=element_blank(),
  panel.grid.major = element_blank(),
  panel.grid.minor = element_blank()) +
  scale_y_continuous(limits = c(25,38), breaks = seq(26,38, by=2))+
  scale_x_continuous(limits = c(28,44), breaks = seq(28,44, by=2))
  
cor_mayne_predo <- ggscatter(Data_PREDO_EPICplacenta, x = "Gestational_Age", y = "DNAmGA_Mayne", 
          add = "reg.line", conf.int = TRUE, 
          #cor.coef = TRUE, cor.method = "pearson",
          xlab = "Gestational Age (weeks)", ylab = "DNAmGA Mayne Clock (weeks)", subtitle="PREDO (n=139)")+
   stat_cor(label.x = 32, label.y=38,p.accuracy = 0.001, r.accuracy = 0.01)+
  theme(axis.text.x = element_text(size=9), axis.text.y=element_text(size=9), axis.title.y = element_text(size=12), axis.title.x=element_blank(),
  panel.grid.major = element_blank(),
  panel.grid.minor = element_blank()) +
  scale_y_continuous(limits = c(25,38), breaks = seq(26,38, by=2))+
  scale_x_continuous(limits = c(32,44), breaks = seq(32,44, by=2))

Mayne_DNAmGA_GA <- ggarrange(
          cor_mayne_itu +
           theme(legend.position="none", plot.margin = margin(r = 0.2) ),
          cor_mayne_predo +
               theme(axis.text.y = element_blank(),
                     axis.ticks.y = element_blank(), axis.title.y = element_blank(), plot.margin = margin(r = 0.2, l = 0.2)),
          nrow = 1,
          align = c("hv"))

# Annotate the figure by adding a common labels
annotate_figure(Mayne_DNAmGA_GA,
                bottom = text_grob("Gestational Age (weeks)", size = 12))
png(file="Results/Figures/corDNAmGAGA/Mayne.png", width= 2400, height=2100, res=480)
annotate_figure(Mayne_DNAmGA_GA,
                bottom = text_grob("Gestational Age (weeks)", size = 12))
dev.off()

png(file="Results/Figures/corDNAmGAGA/Mayne_CVS.png", width= 800, height=1400, res=320)
cor_mayne_itu_cvs
dev.off()
cor_lee_itu_cvs <- ggscatter(Data_CVS_ITU, x = "gestage_at_CVS_weeks", y = "DNAmGA_Lee", 
          add = "reg.line", conf.int = TRUE, 
         # cor.coef = TRUE, cor.method = "pearson",
          xlab = "Gestational Age (weeks)", ylab = "DNAmGA Lee Clock (weeks)", subtitle="ITU CVS (n=264)")+
   stat_cor(label.x = 10, label.y=20,p.accuracy = 0.001, r.accuracy = 0.01)+
  theme(axis.text.x = element_text(size=9), axis.text.y=element_text(size=9), axis.title.y = element_text(size=12), axis.title.x=element_text(size=12),
  panel.grid.major = element_blank(),
  panel.grid.minor = element_blank())+
  scale_y_continuous(limits = c(4,20), breaks = seq(4,20, by=2))+
 scale_x_continuous(limits = c(10,16), breaks = seq(10,16, by=2))


cor_lee_itu <- ggscatter(Data_Placenta_ITU, x = "Gestational_Age_Weeks", y = "DNAmGA_Lee", 
          add = "reg.line", conf.int = TRUE, 
          #cor.coef = TRUE, cor.method = "pearson",
          xlab = "Gestational Age (weeks)", ylab = "DNAmGA Lee Clock (weeks)", subtitle="ITU (n=486)")+
   stat_cor(label.x = 28, label.y=44,p.accuracy = 0.001, r.accuracy = 0.01)+
  theme(axis.text.x = element_text(size=9), axis.text.y=element_text(size=9), axis.title.y = element_text(size=12), axis.title.x=element_blank(),
  panel.grid.major = element_blank(),
  panel.grid.minor = element_blank()) +
  scale_y_continuous(limits = c(30,44), breaks = seq(30,44, by=2))+
  scale_x_continuous(limits = c(28,44), breaks = seq(28,44, by=2))
  
cor_lee_predo <- ggscatter(Data_PREDO_EPICplacenta, x = "Gestational_Age", y = "DNAmGA_Lee", 
          add = "reg.line", conf.int = TRUE, 
          #cor.coef = TRUE, cor.method = "pearson",
          xlab = "Gestational Age (weeks)", ylab = "DNAmGA Lee Clock (weeks)", subtitle="PREDO (n=139)")+
   stat_cor(label.x = 32, label.y=44,p.accuracy = 0.001, r.accuracy = 0.01)+
  theme(axis.text.x = element_text(size=9), axis.text.y=element_text(size=9), axis.title.y = element_text(size=12), axis.title.x=element_blank(),
  panel.grid.major = element_blank(),
  panel.grid.minor = element_blank()) +
  scale_y_continuous(limits = c(30,44), breaks = seq(30,44, by=2))+
  scale_x_continuous(limits = c(32,44), breaks = seq(32,44, by=2))

Lee_DNAmGA_GA <- ggarrange(
          cor_lee_itu +
           theme(legend.position="none", plot.margin = margin(r = 0.2) ),
          cor_lee_predo +
               theme(axis.text.y = element_blank(),
                     axis.ticks.y = element_blank(), axis.title.y = element_blank(), plot.margin = margin(r = 0.2, l = 0.2)),
          nrow = 1,
          align = c("hv"))

# Annotate the figure by adding a common labels
annotate_figure(Lee_DNAmGA_GA,
                bottom = text_grob("Gestational Age (weeks)", size = 12))
png(file="Results/Figures/corDNAmGAGA/Lee.png", width= 2400, height=2100, res=480)
annotate_figure(Lee_DNAmGA_GA,
                bottom = text_grob("Gestational Age (weeks)", size = 12))
dev.off()

png(file="Results/Figures/corDNAmGAGA/Lee_CVS.png", width= 800, height=1400, res=320)
cor_lee_itu_cvs
dev.off()

Correlation Clocks

correlation cordblood clocks

ifelse(!dir.exists(file.path(getwd(), "Results/Figures/corClocks")), dir.create(file.path(getwd(), "Results/Figures/corClocks")), FALSE)
cor_cord_clocks_itu <- 
  ggscatter(Data_Cord_ITU, x = "DNAmGA_Knight", y = "DNAmGA_Bohlin", 
          add = "reg.line", conf.int = TRUE, 
          #cor.coef = TRUE, cor.method = "pearson",
          xlab = "DNAmGA estimated by the Knight Clock", ylab = "DNAmGA estimated by the Bohlin Clock (weeks)", subtitle="ITU (n=426)")+
   stat_cor(label.x = 30, label.y=43,p.accuracy = 0.001, r.accuracy = 0.01)+
  theme(axis.text.x = element_text(size=9), axis.text.y=element_text(size=9), axis.title.y = element_text(size=12), axis.title.x=element_blank(),
  panel.grid.major = element_blank(),
  panel.grid.minor = element_blank()) +
  scale_y_continuous(limits = c(32,44), breaks = seq(32, 44, by=2))+
  scale_x_continuous(limits = c(30,44), breaks = seq(30, 44, by=2))
  #coord_cartesian(ylim = c(32,43))

cor_cord_clocks_predo <-ggscatter(Data_PREDO_EPICcord, x = "DNAmGA_Knight", y = "DNAmGA_Bohlin", 
          add = "reg.line", conf.int = TRUE, 
          #cor.coef = TRUE, cor.method = "pearson",
          xlab = "DNAmGA estimated by the Knight Clock", ylab = "DNAmGA estimated by the Bohlin Clock", subtitle="PREDO EPIC (n=149)")+
   stat_cor(label.x = 30,label.y=43, p.accuracy = 0.001, r.accuracy = 0.01)+
  theme(axis.text.x = element_text(size=9), axis.text.y=element_text(size=9), axis.title.y = element_blank(), axis.title.x=element_blank(),
  panel.grid.major = element_blank(),
  panel.grid.minor = element_blank()) +
  scale_y_continuous(limits = c(32,44), breaks = seq(32, 44, by=2))+
  scale_x_continuous(limits = c(30,44), breaks = seq(30, 44, by=2))
 # coord_cartesian(ylim = c(32,43))

cor_cord_clocks_predo_450k <- ggscatter(Data_PREDO_450Kcord, x = "DNAmGA_Knight", y = "DNAmGA_Bohlin",
          add = "reg.line", conf.int = TRUE, 
         # cor.coef = TRUE, cor.method = "pearson",
          xlab = "DNAmGA estimated by the Knight Clock", ylab = "DNAmGA estimated by the Bohlin Clock", subtitle="PREDO 450K (n=795)")+
   stat_cor(label.x = 30, label.y=43,p.accuracy = 0.001, r.accuracy = 0.01)+
  theme(axis.text.x = element_text(size=9), axis.text.y=element_text(size=9), axis.title.y = element_blank(), axis.title.x=element_blank(), legend.title = element_blank(),
  panel.grid.major = element_blank(),
  panel.grid.minor = element_blank()) +
  scale_y_continuous(limits = c(32,44), breaks = seq(32, 44, by=2))+
  scale_x_continuous(breaks = seq(30, 44, by=2))
 # coord_cartesian(ylim = c(32,43))

#ggarrange(grobs=cor_cord_clocks_itu, cor_cord_clocks_predo, cor_cord_clocks_predo_450k, nrow=1, align=c("hv"), top="Correlation Cord blood Clocks")

clock_cord_cor_gg <- ggarrange(
          cor_cord_clocks_itu +
           theme(legend.position="none", plot.margin = margin(r = 0.2) ),
          cor_cord_clocks_predo +
               theme(axis.text.y = element_blank(),
                     axis.ticks.y = element_blank(), axis.title.y = element_blank(), plot.margin = margin(r = 0.2, l = 0.2)),
          cor_cord_clocks_predo_450k +
               theme(axis.text.y = element_blank(),
                     axis.ticks.y = element_blank(),
                     plot.margin = margin(l = 0.2)),
          nrow = 1,
          align = c("hv"))

# Annotate the figure by adding a common labels
cor_clock_cor <- annotate_figure(clock_cord_cor_gg,
                bottom = text_grob("DNAmGA estimated by the Knight Clock (weeks)", size = 12), top = text_grob("Correlation Cord blood Clocks \n", size = 14))
png(file="Results/Figures/corClocks/cord.png", width= 3600, height=2100, res=480)
annotate_figure(clock_cord_cor_gg,
                bottom = text_grob("DNAmGA estimated by the Knight Clock (weeks)", size = 12))
dev.off()

to the top

correlation placenta clocks

cor_placenta_clocks_itu <- ggscatter(Data_Placenta_ITU, x = "DNAmGA_Mayne", y = "DNAmGA_Lee", 
          add = "reg.line", conf.int = TRUE, 
         # cor.coef = TRUE, cor.method = "pearson",
          xlab = "DNAmGA estimated by the Mayne Clock", ylab = "DNAmGA estimated by the Lee Clock (weeks)", subtitle="ITU (n=486)")+
   stat_cor(label.x = 25, label.y=43,p.accuracy = 0.001, r.accuracy = 0.01)+
  theme(axis.text.x = element_text(size=9), axis.text.y=element_text(size=9), axis.title.y = element_text(size=12), axis.title.x=element_blank(),
  panel.grid.major = element_blank(),
  panel.grid.minor = element_blank()) +
  scale_y_continuous(limits = c(30,44), breaks = seq(30,44, by=2))+
  scale_x_continuous(limits = c(25,40), breaks = seq(26,40, by=2))


cor_placenta_clocks_predo <- ggscatter(Data_PREDO_EPICplacenta, x = "DNAmGA_Mayne", y = "DNAmGA_Lee", 
          add = "reg.line", conf.int = TRUE, 
          #cor.coef = TRUE, cor.method = "pearson",
          xlab = "DNAmGA estimated by the Lee Clock", ylab = "DNAmGA estimated by the Mayne Clock", subtitle="PREDO (n=139)")+
   stat_cor(label.x = 26, label.y=43,p.accuracy = 0.001, r.accuracy = 0.01)+
  theme(axis.text.x = element_text(size=9), axis.text.y=element_text(size=9), axis.title.y = element_text(size=12), axis.title.x=element_blank(),
  panel.grid.major = element_blank(),
  panel.grid.minor = element_blank()) +
  scale_y_continuous(limits = c(30,44), breaks = seq(30,44, by=2))+
  scale_x_continuous(limits = c(26,36), breaks = seq(26,36, by=2))

clock_placenta_cor_gg <- ggarrange(
          cor_placenta_clocks_itu +
           theme(legend.position="none", plot.margin = margin(r = 0.2) ),
          cor_placenta_clocks_predo +
               theme(axis.text.y = element_blank(),
                     axis.ticks.y = element_blank(), axis.title.y = element_blank(), plot.margin = margin(r = 0.2, l = 0.2)),
          nrow = 1,
          align = c("hv"))

# Annotate the figure by adding a common labels
pla_clock_cor <- annotate_figure(clock_placenta_cor_gg,
                bottom = text_grob("DNAmGA estimated by the Mayne Clock (weeks)", size = 12), top = text_grob("Correlation Placenta Clocks \n", size = 14))
png(file="Results/Figures/corClocks/placenta.png", width= 2400, height=1400, res=320)
annotate_figure(clock_placenta_cor_gg,
                bottom = text_grob("DNAmGA estimated by the Mayne Clock (weeks)", size = 12))
dev.off()
ggscatter(Data_CVS_ITU, x = "Gestational_Age_Weeks", y = "delta_Lee", 
          add = "reg.line", conf.int = TRUE, 
          cor.coef = TRUE, cor.method = "pearson",
          xlab = "gestational age (weeks)", ylab = "delta Lee", title="Correlation CVS gestational age deviance (ITU)")

to the top

EAAR Descriptive

ITU: Visualization EAAR

ifelse(!dir.exists(file.path(getwd(), "Results/Figures/EAAR_descriptive")), dir.create(file.path(getwd(), "Results/Figures/EAAR_descriptive")), FALSE)

CVS

EAARCVS <- ggplot(Data_CVS_ITU, aes(x= gestage_at_CVS_weeks, y= EAAR_Lee, label=Sample_Name))+
  geom_point() +geom_text(aes(label=Sample_Name),hjust=0, vjust=0)+
  xlab("gestational age at sampling (weeks)")+
  xlim(5,20)+
  ylim(-10,10)+
  geom_line(y=0, linetype="dashed")+
  ylab("epigenetic age acceleration residuals \n(Lee clock)")

EAARCVS_sex <- Data_CVS_ITU[!is.na(Data_CVS_ITU$EAAR_Lee), ] %>%
  group_by(Child_Sex) %>%
  mutate(outlier = ifelse(is_outlier(EAAR_Lee), Sample_Name, as.numeric(NA))) %>%
  ggplot(., aes(x = Child_Sex, y = EAAR_Lee)) +
    geom_boxplot() +
    geom_text(size=2.5, aes(label = outlier), na.rm = TRUE, hjust=-0.3)+
  xlab("Child sex")+
  ylab("epigenetic age acceleration residuals \n(Lee clock)")+
  geom_hline(aes(yintercept=0))

EAARCVS_boxplot <- ggplot(Data_CVS_ITU, aes(x=EAAR_Lee))+ geom_histogram(binwidth=0.1)+ labs(x="epigenetic age acceleration residuals (Lee clock)", y = "Count (N = 200)")

cowplot::plot_grid(EAARCVS, EAARCVS_sex, EAARCVS_boxplot)

length(na.omit(Data_CVS_ITU$EAAR_Lee))
# note that 65 rows were removed because they are NA in EAARVS (no ethnicity info)
```r
deltaCVS_boxplot <- ggplot(Data_CVS_ITU, aes(x=delta_Lee))+ geom_histogram(binwidth=0.1)+ labs(x=\epigenetic age acceleration delta (Lee clock)\, y = \Count (N = 200)\)
#deltaCVS_boxplot

<!-- rnb-source-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->




<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxucG5nKGZpbGU9XCJSZXN1bHRzL0ZpZ3VyZXMvRUFBUl9kZXNjcmlwdGl2ZS9DVlMucG5nXCIsd2lkdGg9MjIwMCwgaGVpZ2h0PTE0MDAsIHJlcz0zMDApXG5nZ3Bsb3QoRGF0YV9DVlNfSVRVLCBhZXMoeD1FQUFSX0xlZSkpKyBnZW9tX2hpc3RvZ3JhbShiaW53aWR0aD0wLjEpKyBsYWJzKHg9XCJFQUFSIChMZWUgY2xvY2spXCIsIHkgPSBcIkNvdW50IChuID0gMjAwKVwiKStcbnRoZW1lKHRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE1KSwgYXhpcy50aXRsZS54PSBlbGVtZW50X3RleHQoc2l6ZT0xNSksIGF4aXMudGl0bGUueT0gZWxlbWVudF90ZXh0KHNpemU9MTUpKVxuZGV2Lm9mZigpXG5gYGAifQ== -->

```r
png(file="Results/Figures/EAAR_descriptive/CVS.png",width=2200, height=1400, res=300)
ggplot(Data_CVS_ITU, aes(x=EAAR_Lee))+ geom_histogram(binwidth=0.1)+ labs(x="EAAR (Lee clock)", y = "Count (n = 200)")+
theme(text = element_text(size = 15), axis.title.x= element_text(size=15), axis.title.y= element_text(size=15))
dev.off()

Cordblood

EAARCord <- ggplot(Data_Cord_ITU, aes(x= Gestational_Age_Weeks, y= EAAR_Bohlin, label=Sample_Name))+
  geom_point() +geom_text(aes(label=Sample_Name),hjust=0, vjust=0)+
  xlab("gestational age at birth (weeks)")+
  xlim(25,50)+
  ylim(-10,10)+
  geom_line(y=0, linetype="dashed")+
  ylab("epigenetic age acceleration residuals \nBohlin clock")

EAARCord_sex <- Data_Cord_ITU[!is.na(Data_Cord_ITU$EAAR_Bohlin), ] %>%
  group_by(Child_Sex) %>%
  mutate(outlier = ifelse(is_outlier(EAAR_Bohlin), Sample_Name, as.numeric(NA))) %>%
  ggplot(., aes(x =Child_Sex, y = EAAR_Bohlin)) +
    geom_boxplot() +
    geom_text(size=2.5,aes(label = outlier), na.rm = TRUE, hjust = -0.3)+
  xlab("Child sex")+
  ylab("epigenetic age acceleration residuals \nBohlin clock")+
  geom_hline(aes(yintercept=0))

EAARCord_boxplot <- ggplot(Data_Cord_ITU, aes(x=EAAR_Bohlin))+ geom_histogram(binwidth=0.1)+ labs(x="EAAR (Bohlin clock)", y = "Count (N = 395)")

cowplot::plot_grid(EAARCord, EAARCord_sex, EAARCord_boxplot)
length(na.omit(Data_Cord_ITU$EAAR_Bohlin))
png(file="Results/Figures/EAAR_descriptive/Cord.png",width=2200, height=1400, res=300)
ggplot(Data_Cord_ITU, aes(x=EAAR_Bohlin))+ geom_histogram(binwidth=0.1)+ labs(x="EAAR (Bohlin clock)", y = "Count (n = 395)")+
theme(text = element_text(size = 15), axis.title.x= element_text(size=15), axis.title.y= element_text(size=15))
dev.off()
```r
deltaCord_boxplot <- ggplot(Data_Cord_ITU, aes(x=delta_Bohlin))+ geom_histogram(binwidth=0.1)+ labs(x=\delta (Bohlin clock)\, y = \Count (N = 395)\)
#deltaCord_boxplot

<!-- rnb-source-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->



**Placenta**

<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuRUFBUlBsYWNlbnRhIDwtIGdncGxvdChEYXRhX1BsYWNlbnRhX0lUVSwgYWVzKHg9IEdlc3RhdGlvbmFsX0FnZV9XZWVrcywgeT0gRUFBUl9MZWUsIGxhYmVsPVNhbXBsZV9OYW1lKSkrXG4gIGdlb21fcG9pbnQoKSArZ2VvbV90ZXh0KGFlcyhsYWJlbD1TYW1wbGVfTmFtZSksaGp1c3Q9MCwgdmp1c3Q9MCkrXG4gIHhsYWIoXCJnZXN0YXRpb25hbCBhZ2UgYXQgYmlydGggKHdlZWtzKVwiKStcbiAgeGxpbSgyNSw1MCkrXG4gIHlsaW0oLTEwLDEwKStcbiAgZ2VvbV9saW5lKHk9MCwgbGluZXR5cGU9XCJkYXNoZWRcIikrXG4gIHlsYWIoXCJlcGlnZW5ldGljIGFnZSBhY2NlbGVyYXRpb24gcmVzaWR1YWxzIFxcbkxlZSBjbG9ja1wiKVxuXG5FQUFSUGxhY2VudGFfc2V4IDwtIERhdGFfUGxhY2VudGFfSVRVWyFpcy5uYShEYXRhX1BsYWNlbnRhX0lUVSRFQUFSX0xlZSksIF0gJT4lXG4gIGdyb3VwX2J5KENoaWxkX1NleCkgJT4lXG4gIG11dGF0ZShvdXRsaWVyID0gaWZlbHNlKGlzX291dGxpZXIoRUFBUl9MZWUpLCBTYW1wbGVfTmFtZSwgYXMubnVtZXJpYyhOQSkpKSAlPiVcbiAgZ2dwbG90KC4sIGFlcyh4ID0gQ2hpbGRfU2V4LCB5ID0gRUFBUl9MZWUpKSArXG4gICAgZ2VvbV9ib3hwbG90KCkgK1xuICAgIGdlb21fdGV4dChzaXplPTIuNSxhZXMobGFiZWwgPSBvdXRsaWVyKSwgbmEucm0gPSBUUlVFLCBoanVzdCA9IC0wLjMpK1xuICB4bGFiKFwiQ2hpbGQgc2V4XCIpK1xuICB5bGFiKFwiZXBpZ2VuZXRpYyBhZ2UgYWNjZWxlcmF0aW9uIHJlc2lkdWFscyBcXG5MZWUgY2xvY2tcIikrXG4gIGdlb21faGxpbmUoYWVzKHlpbnRlcmNlcHQ9MCkpXG5cbkVBQVJQbGFjZW50YV9ib3hwbG90IDwtIGdncGxvdChEYXRhX1BsYWNlbnRhX0lUVSwgYWVzKHg9RUFBUl9MZWUpKSsgZ2VvbV9oaXN0b2dyYW0oYmlud2lkdGg9MC4xKSsgbGFicyh4PVwiRUFBUiAoTGVlIGNsb2NrKVwiLCB5ID0gXCJDb3VudCAoTiA9IDQzOSlcIilcblxuY293cGxvdDo6cGxvdF9ncmlkKEVBQVJQbGFjZW50YSwgRUFBUlBsYWNlbnRhX3NleCwgRUFBUlBsYWNlbnRhX2JveHBsb3QpXG5sZW5ndGgobmEub21pdChEYXRhX1BsYWNlbnRhX0lUVSRFQUFSX0xlZSkpXG5gYGAifQ== -->

```r
EAARPlacenta <- ggplot(Data_Placenta_ITU, aes(x= Gestational_Age_Weeks, y= EAAR_Lee, label=Sample_Name))+
  geom_point() +geom_text(aes(label=Sample_Name),hjust=0, vjust=0)+
  xlab("gestational age at birth (weeks)")+
  xlim(25,50)+
  ylim(-10,10)+
  geom_line(y=0, linetype="dashed")+
  ylab("epigenetic age acceleration residuals \nLee clock")

EAARPlacenta_sex <- Data_Placenta_ITU[!is.na(Data_Placenta_ITU$EAAR_Lee), ] %>%
  group_by(Child_Sex) %>%
  mutate(outlier = ifelse(is_outlier(EAAR_Lee), Sample_Name, as.numeric(NA))) %>%
  ggplot(., aes(x = Child_Sex, y = EAAR_Lee)) +
    geom_boxplot() +
    geom_text(size=2.5,aes(label = outlier), na.rm = TRUE, hjust = -0.3)+
  xlab("Child sex")+
  ylab("epigenetic age acceleration residuals \nLee clock")+
  geom_hline(aes(yintercept=0))

EAARPlacenta_boxplot <- ggplot(Data_Placenta_ITU, aes(x=EAAR_Lee))+ geom_histogram(binwidth=0.1)+ labs(x="EAAR (Lee clock)", y = "Count (N = 439)")

cowplot::plot_grid(EAARPlacenta, EAARPlacenta_sex, EAARPlacenta_boxplot)
length(na.omit(Data_Placenta_ITU$EAAR_Lee))
png("Results/Figures/EAAR_descriptive/Placenta.png", width=2200, height=1400, res=300)
ggplot(Data_Placenta_ITU, aes(x=EAAR_Lee))+ geom_histogram(binwidth=0.1)+ labs(x="EAAR (Lee clock)", y = "Count (n = 439)")+
theme(text = element_text(size = 15), axis.title.x= element_text(size=15), axis.title.y= element_text(size=15))
dev.off()
deltaPlacenta_boxplot <- ggplot(Data_Placenta_ITU, aes(x=delta_Lee))+ geom_histogram(binwidth=0.1)+ labs(x="delta (Lee clock)", y = "Count (N = 486)")
deltaPlacenta_boxplot 

to the top

PREDO: Visualization EAAR

450K Cordblood

EAARCord450K <- ggplot(Data_PREDO_450Kcord, aes(x= Gestational_Age, y= EAAR_Bohlin, label=Sample_Name))+
  geom_point() +geom_text(aes(label=Sample_Name),hjust=0, vjust=0)+
  xlab("gestational age at birth (weeks)")+
  xlim(25,50)+
  ylim(-15,15)+
  geom_line(y=0, linetype="dashed")+
  ylab("epigenetic age acceleration residuals \nBohlin clock")

EAARCord450K_sex <- Data_PREDO_450Kcord[!is.na(Data_PREDO_450Kcord$EAAR_Bohlin), ] %>%
  group_by(Child_Sex) %>%
  mutate(outlier = ifelse(is_outlier(EAAR_Bohlin), Sample_Name, as.numeric(NA))) %>%
  ggplot(., aes(x = Child_Sex, y = EAAR_Bohlin)) +
    geom_boxplot() +
    geom_text(size=2.5,aes(label = outlier), na.rm = TRUE, hjust = -0.3)+
  xlab("Child sex")+
  ylab("epigenetic age acceleration residuals \nBohlin clock")+
  geom_hline(aes(yintercept=0))

EAARCord450K_boxplot <- ggplot(Data_PREDO_450Kcord, aes(x=EAAR_Bohlin))+ geom_histogram(binwidth=0.1)+ labs(x="EAAR (Bohlin clock)", y = "Count (N = 785)")

#cowplot::plot_grid(EAARCord450K, EAARCord450K_sex, EAARCord450K_boxplot)
length(na.omit(Data_PREDO_450Kcord$EAAR_Bohlin))
png("Results/Figures/EAAR_descriptive/Cord450K_PREDO.png", width=2200, height=1400, res=300)
ggplot(Data_PREDO_450Kcord, aes(x=EAAR_Bohlin))+ geom_histogram(binwidth=0.1)+ labs(x="EAAR (Bohlin clock)", y = "Count (n = 785)")+
theme(text = element_text(size = 15), axis.title.x= element_text(size=15), axis.title.y= element_text(size=15))
dev.off()

EPIC Cordblood

EAARCordEPIC <- ggplot(Data_PREDO_EPICcord, aes(x= Gestational_Age, y= EAAR_Bohlin, label=Sample_Name))+
  geom_point() +geom_text(aes(label=Sample_Name),hjust=0, vjust=0)+
  xlab("gestational age at birth (weeks)")+
  xlim(30,45)+
  ylim(-15,15)+
  geom_line(y=0, linetype="dashed")+
  ylab("epigenetic age acceleration residuals \nBohlin clock")

EAARCordEPIC_sex <- Data_PREDO_EPICcord[!is.na(Data_PREDO_EPICcord$EAAR_Bohlin), ] %>%
  group_by(Child_Sex) %>%
  mutate(outlier = ifelse(is_outlier(EAAR_Bohlin), Sample_Name, as.numeric(NA))) %>%
  ggplot(., aes(x = Child_Sex, y = EAAR_Bohlin)) +
    geom_boxplot() +
    geom_text(aes(label = outlier), na.rm = TRUE, hjust = -0.3)+
  xlab("Child sex")+
  ylab("epigenetic age acceleration residuals \nBohlin clock")+
  geom_hline(aes(yintercept=0))

EAARCordEPIC_boxplot <- ggplot(Data_PREDO_EPICcord, aes(x=EAAR_Bohlin))+ geom_histogram(binwidth=0.1)+ labs(x="EAAR (Bohlin clock)", y = "Count (N = 146)")

#cowplot::plot_grid(EAARCordEPIC, EAARCordEPIC_sex, EAARCordEPIC_boxplot)
length(na.omit(Data_PREDO_EPICcord$EAAR_Bohlin))
png("Results/Figures/EAAR_descriptive/CordEPIC_PREDO.png", width=2200, height=1400, res=300)
ggplot(Data_PREDO_EPICcord, aes(x=EAAR_Bohlin))+ geom_histogram(binwidth=0.1)+ labs(x="EAAR (Bohlin clock)", y = "Count (n = 146)")+
theme(text = element_text(size = 15), axis.title.x= element_text(size=15), axis.title.y= element_text(size=15))
dev.off()

EPIC Placenta

EAARPlacentaEPIC <- ggplot(Data_PREDO_EPICplacenta, aes(x= Gestational_Age, y= EAAR_Lee, label=Sample_Name))+
  geom_point() +geom_text(aes(label=Sample_Name),hjust=0, vjust=0)+
  xlab("gestational age at birth (weeks)")+
  xlim(30,45)+
  ylim(-15,15)+
  geom_line(y=0, linetype="dashed")+
  ylab("epigenetic age acceleration residuals \nLee clock")

EAARPlacentaEPIC_sex <- Data_PREDO_EPICplacenta[!is.na(Data_PREDO_EPICplacenta$EAAR_Lee),] %>%
  group_by(Child_Sex) %>%
  #mutate(outlier = ifelse(is_outlier(EAAR_Lee), Sample_Name, as.numeric(NA))) %>%
  ggplot(., aes(x = Child_Sex, y = EAAR_Lee)) +
    geom_boxplot() +
    #geom_text(size=2.5, aes(label = outlier), na.rm = TRUE, hjust = -0.3)+
  xlab("Child sex")+
  ylab("epigenetic age acceleration residuals \nLee clock")+
  geom_hline(aes(yintercept=0))

EAARPlacentaEPIC_boxplot <- ggplot(Data_PREDO_EPICplacenta, aes(x=EAAR_Lee))+ geom_histogram(binwidth=0.1)+ labs(x="EAAR (Lee clock)", y = "Count (N = 118)")

#cowplot::plot_grid(EAARPlacentaEPIC, EAARPlacentaEPIC_sex, EAARPlacentaEPIC_boxplot)
length(na.omit(Data_PREDO_EPICplacenta$EAAR_Lee))
png("Results/Figures/EAAR_descriptive/PlacentaEPIC_PREDO.png", width=2200, height=1400, res=300)
ggplot(Data_PREDO_EPICplacenta, aes(x=EAAR_Lee))+ geom_histogram(binwidth=0.1)+ labs(x="EAAR (Lee clock)", y = "Count (n = 118)")+
theme(text = element_text(size = 15), axis.title.x= element_text(size=15), axis.title.y= element_text(size=15))
dev.off()

to the top

Single Tissue Models

ifelse(!dir.exists(file.path(getwd(), "InputData/Data_ElasticNets/")), dir.create(file.path(getwd(), "InputData/Data_ElasticNets/")), FALSE)
ifelse(!dir.exists(file.path(getwd(), "Results/Figures/elasticNet_singleTissues/")), dir.create(file.path(getwd(), "Results/Figures/elasticNet_singleTissues/")), FALSE)
ifelse(!dir.exists(file.path(getwd(), "Results/Figures/elasticNet_singleTissues/Outcome_main/")), dir.create(file.path(getwd(), "Results/Figures/elasticNet_singleTissues/Outcome_main/")), FALSE)
ifelse(!dir.exists(file.path(getwd(), "Results/Figures/elasticNet_singleTissues/Outcome_add/")), dir.create(file.path(getwd(), "Results/Figures/elasticNet_singleTissues/Outcome_add/")), FALSE)
ifelse(!dir.exists(file.path(getwd(), "Results/Figures/elasticNet_singleTissues/Outcome_add/alcohol")), dir.create(file.path(getwd(), "Results/Figures/elasticNet_singleTissues/Outcome_add/alcohol")), FALSE)
ifelse(!dir.exists(file.path(getwd(), "Results/Figures/elasticNet_singleTissues/Outcome_add/sex_split")), dir.create(file.path(getwd(), "Results/Figures/elasticNet_singleTissues/Outcome_add/sex_split")), FALSE)
ifelse(!dir.exists(file.path(getwd(), "Results/Tables/")), dir.create(file.path(getwd(), "Results/Tables/")), FALSE)
```r
rm(list = setdiff(ls(), lsf.str()))

<!-- rnb-source-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->



**ITU**

## Cord blood elastic net {#elasticnetCordITU}  
main model, without alcohol variable


<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxuIyBpbiBjYXNlIHlvdSB3YW50IHRvIHN0YXJ0IGZyb20gaGVyZVxubG9hZChcXElucHV0RGF0YS9DbG9ja0NhbGN1bGF0aW9uc0lucHV0L1JlZ19JbnB1dF9EYXRhX0NvcmRfSVRVX0VBQVJfbm9OYV9uLlJkYXRhXFwpXG5gYGBcbmBgYCJ9 -->

```r
```r
# in case you want to start from here
load(\InputData/ClockCalculationsInput/Reg_Input_Data_Cord_ITU_EAAR_noNa_n.Rdata\)

<!-- rnb-source-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->




<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxueXJjX21hdF9JVFVfQ29yZF9uIDwtIG1hdHJpeChSZWdfSW5wdXRfRGF0YV9Db3JkX0lUVV9FQUFSX25vTmFfbiRFQUFSX0JvaGxpbilcbnhyY19tYXRfSVRVX0NvcmRfbiA8LSBtb2RlbC5tYXRyaXgoIH4gLiAtIEVBQVJfQm9obGluLCBkYXRhID0gUmVnX0lucHV0X0RhdGFfQ29yZF9JVFVfRUFBUl9ub05hX24pWywgLTFdXG55cmNfbWF0X0lUVV9zY2FsZWRfQ29yZF9uIDwtIHNjYWxlKHlyY19tYXRfSVRVX0NvcmRfbilcbnhyY19tYXRfSVRVX3NjYWxlZF9Db3JkX24gPC0gc2NhbGUoeHJjX21hdF9JVFVfQ29yZF9uKVxuYGBgXG5gYGAifQ== -->

```r
```r
yrc_mat_ITU_Cord_n <- matrix(Reg_Input_Data_Cord_ITU_EAAR_noNa_n$EAAR_Bohlin)
xrc_mat_ITU_Cord_n <- model.matrix( ~ . - EAAR_Bohlin, data = Reg_Input_Data_Cord_ITU_EAAR_noNa_n)[, -1]
yrc_mat_ITU_scaled_Cord_n <- scale(yrc_mat_ITU_Cord_n)
xrc_mat_ITU_scaled_Cord_n <- scale(xrc_mat_ITU_Cord_n)

<!-- rnb-source-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->


<!-- set seed -->
<!-- ```{r} -->
<!-- set.seed(2020) -->
<!-- ``` -->


<!-- ```{r, warning=F} -->
<!--   nboot = 1000 -->

<!--   start_time <- Sys.time() -->
<!--   bootstraps_Cord_ITU_n <- replicate(nboot, { -->
<!--     rws <- sample(1:nrow(xrc_mat_ITU_scaled_Cord_n), replace = TRUE) -->
<!--     ensr(xrc_mat_ITU_scaled_Cord_n[rws, ], yrc_mat_ITU_scaled_Cord_n[rws, ], standardized = FALSE, family="gaussian", nlambda=100, nfolds=10, alpha=c(0.0,0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1.0)) -->
<!--   }, -->
<!--   simplify = FALSE) -->

<!--   end_time <- Sys.time() -->
<!--   end_time - start_time -->

<!-- ``` -->

<!-- ```{r} -->
<!-- save(bootstraps_Cord_ITU_n, file="InputData/Data_ElasticNets/bootstraps_Cord_ITU_n_1000.Rdata") -->
<!-- ``` -->



<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxubG9hZChcXElucHV0RGF0YS9EYXRhX0VsYXN0aWNOZXRzL2Jvb3RzdHJhcHNfQ29yZF9JVFVfbl8xMDAwLlJkYXRhXFwpXG5gYGBcbmBgYCJ9 -->

```r
```r
load(\InputData/Data_ElasticNets/bootstraps_Cord_ITU_n_1000.Rdata\)

<!-- rnb-source-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->


first get a summary of all ensr objects

<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuc3VtbWFyaWVzX0NvcmRfSVRVX24gPC1cbiAgYm9vdHN0cmFwc19Db3JkX0lUVV9uICU+JVxuICBsYXBwbHkoc3VtbWFyeSkgJT4lXG4gIHJiaW5kbGlzdChpZGNvbCA9IFwiYm9vdHN0cmFwXCIpXG5cbnN1bW1hcmllc19Db3JkX0lUVV9uXG5gYGAifQ== -->

```r
summaries_Cord_ITU_n <-
  bootstraps_Cord_ITU_n %>%
  lapply(summary) %>%
  rbindlist(idcol = "bootstrap")

summaries_Cord_ITU_n

The summary method for ensr objects returns a data.table with values of λ, α, the mean cross-validation error cvm, and the number of non-zero coefficients. The l_index is the list index of the ensr object associated with the noted α value.

For each bootstrap, look at the number of non-zero coefficients and the minimum cvm for this number of non-zero coefficients:

summaries_Cord_ITU_n[, .SD[cvm == min(cvm)], by = c("bootstrap", "nzero")] %>%
  ggplot2::ggplot(data = .) +
  ggplot2::aes(x = nzero, y = cvm, group = bootstrap) +
  ggplot2::geom_point() +
  ggplot2::geom_line()+
  ggplot2::labs(x="\nnzero", y="cvm\n")+
  ggplot2::theme(text = element_text(size = 15), axis.title.x= element_text(size=15), axis.title.y= element_text(size=15))+
  ggplot2::theme_bw()
  

in the “standard” procedure, the preferable model is defined as the model with the minimum cvm (nzero, alpha, lambda etc. are selected from this)

png(filename="Results/Figures/elasticNet_singleTissues/Outcome_main/bootstraps_Cord.png", width=2200, height=1400, res=400)
summaries_Cord_ITU_n[, .SD[cvm == min(cvm)], by = c("bootstrap", "nzero")] %>%
  ggplot2::ggplot(data = .) +
  ggplot2::aes(x = nzero, y = cvm, group = bootstrap) +
  ggplot2::geom_point() +
  ggplot2::geom_line()+
  ggplot2::labs(x="\nnzero", y="cvm\n")+
  ggplot2::theme(text = element_text(size = 18), axis.title.x= element_text(size=20), axis.title.y= element_text(size=20))+
  ggplot2::theme_bw()
dev.off()

Now a look at the coefficients build a data.table with columns to store the coefficient values for the models with smallest cvm by number of non-zero coefficients (and bootstrap).

```r
load(\InputData/Data_ElasticNets/pm2_Cord_ITU_n.Rdata\)
# coefficient values for the models with smallest cvm by number of non-erzo coefficients and bootstrap

<!-- rnb-source-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->


look how often a particular variable is associated with a non-zero coefficient in a model with a given number of non-zero coefficients (over all bootstraps)


<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuY3N1bW1hcnlfQ29yZF9JVFVfbiA8LSBSZWR1Y2UoZnVuY3Rpb24oeCx5KSBtZXJnZSh4ID0geCwgeSA9IHksIGJ5ID0gXCJuemVyb1wiKSwgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdChwbTJfQ29yZF9JVFVfblssIGxhcHBseSguU0QsIGZ1bmN0aW9uKHgpIHttZWFuKHggIT0gMCl9KSwgLlNEY29scyA9IGMoXCJDaGlsZF9TZXhmZW1hbGVcIiwgXCJDaGlsZF9CaXJ0aF9XZWlnaHRcIiwgXCJDaGlsZF9CaXJ0aF9MZW5ndGhcIiwgXCJDaGlsZF9IZWFkX0NpcmN1bWZlcmVuY2VfQXRfQmlydGhcIiwgXCJEZWxpdmVyeV9tb2RlX2RpY2hvdG9tYWlkZWRcIiwgXCJJbmR1Y2VkX0xhYm91cnllc1wiLCBcIlBhcml0eV9kaWNob3RvbWdpdmVuIGJpcnRoIGJlZm9yZVwiLCBcIk1hdGVybmFsX0FnZV9ZZWFyc1wiLCBcIk1hdGVybmFsX0JvZHlfTWFzc19JbmRleF9pbl9FYXJseV9QcmVnbmFuY3lcIiwgXCJNYXRlcm5hbF9IeXBlcnRlbnNpb25fZGljaG90b21oeXBlcnRlbnNpb24gaW4gY3VycmVudCBwcmVnbmFuY3lcIiwgXCJNYXRlcm5hbF9EaWFiZXRlc19kaWNob3RvbWRpYWJldGVzIGluIGN1cnJlbnQgcHJlZ25hbmN5XCIsIFwiTWF0ZXJuYWxfTWVudGFsX0Rpc29yZGVyc1llc1wiLCBcInNtb2tpbmdfZGljaG90b215ZXNcIiksIGJ5ID0gbnplcm9dXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbTJfQ29yZF9JVFVfblssIC4obWVhbl9jdm0gPSBtZWFuKGN2bSkpLCBieSA9IG56ZXJvXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBtMl9Db3JkX0lUVV9uWywgLihtZWRpYW5fY3ZtID0gbWVkaWFuKGN2bSkpLCBieSA9IG56ZXJvXVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkpW29yZGVyKG56ZXJvKV1cblxuY3N1bW1hcnlfQ29yZF9JVFVfblxuYGBgIn0= -->

```r
csummary_Cord_ITU_n <- Reduce(function(x,y) merge(x = x, y = y, by = "nzero"), 
                               list(pm2_Cord_ITU_n[, lapply(.SD, function(x) {mean(x != 0)}), .SDcols = c("Child_Sexfemale", "Child_Birth_Weight", "Child_Birth_Length", "Child_Head_Circumference_At_Birth", "Delivery_mode_dichotomaided", "Induced_Labouryes", "Parity_dichotomgiven birth before", "Maternal_Age_Years", "Maternal_Body_Mass_Index_in_Early_Pregnancy", "Maternal_Hypertension_dichotomhypertension in current pregnancy", "Maternal_Diabetes_dichotomdiabetes in current pregnancy", "Maternal_Mental_DisordersYes", "smoking_dichotomyes"), by = nzero]
                                    ,
                                    pm2_Cord_ITU_n[, .(mean_cvm = mean(cvm)), by = nzero],
                                    pm2_Cord_ITU_n[, .(median_cvm = median(cvm)), by = nzero]
                               ))[order(nzero)]

csummary_Cord_ITU_n

plot the results, in the following graphic the size and color of the points in the top plot indicate how often the variable is in the model with nzero non-zero coefficents

g1_Cord_ITU_n <-
  csummary_Cord_ITU_n %>%
  melt(id.vars = c("nzero", "mean_cvm", "median_cvm")) %>%
  ggplot2::ggplot(.) +
  ggplot2::theme_bw() +
  ggplot2::aes(x = nzero) +
  ggplot2::geom_point(mapping = ggplot2::aes(y = variable, size = value, alpha = value, color = value*100)) +
  ggplot2::scale_color_gradient2(high = 'green', mid = "purple", low = "black", midpoint =50)+
  ggplot2::scale_alpha(guide = 'none')+
  ggplot2::scale_size(guide = 'none')+
  ggplot2::scale_y_discrete(labels= c("child sex", "birth weight", "birth length", "head circumference", "delivery mode", "induced labor", "parity", "maternal age", "maternal BMI", "maternal hypertension", "maternal diabetes", "maternal mental disorders", "maternal smoking"))+
  ggplot2::scale_x_continuous(breaks=0:14, labels=)+
  ggplot2::labs(y="predictor\n", x = "\nnumber of non-zero coefficients", color="%")+
  ggplot2::theme(text = element_text(size = 15), axis.title.x= element_text(size=15), axis.title.y= element_text(size=15))
  

g2_Cord_ITU_n <-
  csummary_Cord_ITU_n %>%
  ggplot2::ggplot(.) +
  ggplot2::theme_bw() +
  ggplot2::aes(x = nzero, y = median_cvm) +
  ggplot2::geom_point() + ggplot2::geom_line()+
  ggplot2::labs(y="median cvm", x = "nzero")+
  ggplot2::scale_x_continuous(breaks=0:14, labels=)+
  ggplot2::theme(axis.text=element_text(size=15),axis.title=element_text(size=18))

gridExtra::grid.arrange(g1_Cord_ITU_n, g2_Cord_ITU_n, ncol = 1)
png(filename="Results/Figures/elasticNet_singleTissues/Outcome_main/bootstrapModels_Cord.png", width=2400, height=1800, res=300)
gridExtra::grid.arrange(g1_Cord_ITU_n, g2_Cord_ITU_n, ncol = 1)
dev.off()
png(filename="Results/Figures/elasticNet_singleTissues/Outcome_main/Model_Cord.png", width=2800, height=1400, res=400)
g1_Cord_ITU_n
dev.off()
elbow_finder(csummary_Cord_ITU_n$nzero, csummary_Cord_ITU_n$median_cvm)

nzero_indices_Cord <- data.frame(t(elbow_finder(csummary_Cord_ITU_n$nzero, csummary_Cord_ITU_n$median_cvm)))
colnames(nzero_indices_Cord) <- c("x", "y")
rownames(nzero_indices_Cord) <- NULL
```r
nzero_final_cord_itu <- 9

<!-- rnb-source-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->


look at models with 9 non-zero coefficient.

<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuY3N1bW1hcnlfQ29yZF9JVFVfbltuemVybyAlaW4lIG56ZXJvX2ZpbmFsX2NvcmRfaXR1XVxuYGBgIn0= -->

```r
csummary_Cord_ITU_n[nzero %in% nzero_final_cord_itu]
nonzero_choose_Cord <- ggplot2::ggplot(csummary_Cord_ITU_n) +
  ggplot2::theme_bw()+
  ggplot2::aes(x = nzero, y = median_cvm) +
  ggplot2::scale_x_continuous(breaks=c(0:17))+
  ggplot2::geom_point() + ggplot2::geom_line()+
  ggplot2::geom_point(data=nzero_indices_Cord, aes(x=x, y=y), colour="red", size=2)+
  ggplot2::ylab("median cvm over bootstraps\n")+
  ggplot2::xlab("\nnumber of non-zero coefficients")+
  ggplot2::geom_segment(aes(x = nzero[1], y = median_cvm[1], xend = nzero[14], yend = median_cvm[14], colour = "segment"), data = csummary_Cord_ITU_n, show.legend = F)+
  ggplot2::theme(text = element_text(size = 15), axis.title.x= element_text(size=15), axis.title.y= element_text(size=15))
  
nonzero_choose_Cord
png(filename="Results/Figures/elasticNet_singleTissues/Outcome_main/nzero_choose_Cord.png", width=2200, height=1400, res=400)
nonzero_choose_Cord
dev.off()

look at models with 9 non-zero coefficients. filter for cut-off 75% -> which variables occur in more than 75% of models.

```r
summary_Cord_ITU_n_finalnzero <- csummary_Cord_ITU_n[nzero %in% nzero_final_cord_itu]
sig_var_names_Cord_ITU_n_finalnzero <- Filter(function(x) any(x > 0.75), summary_Cord_ITU_n_finalnzero[,!c(\nzero\, \mean_cvm\, \median_cvm\)]) %>% colnames()
colnames(summary_Cord_ITU_n_finalnzero) <- c(\non-zero\, \child sex (female)\, \birth weight\, \birth length\, \head circumference\, \delivery mode (aided)\, \induced labor (yes)\, \parity (birth before)\, \maternal age\, \maternal BMI\, \maternal hypertension (yes)\, \maternal diabetes (yes)\, \maternal mental disorders (yes)\, \maternal smoking (yes)\, \mean cvm\, \median cvm\)
summary_Cord_ITU_n_finalnzeroT <- as.data.frame(t(summary_Cord_ITU_n_finalnzero[,-c(\non-zero\, \median cvm\, \mean cvm\)]))
summary_Cord_ITU_n_finalnzeroT$variable <- rownames(summary_Cord_ITU_n_finalnzeroT)
rownames(summary_Cord_ITU_n_finalnzeroT) <- NULL
names(summary_Cord_ITU_n_finalnzeroT)[names(summary_Cord_ITU_n_finalnzeroT) == 'V1'] <- 'percent'
summary_Cord_ITU_n_finalnzeroT <- summary_Cord_ITU_n_finalnzeroT[order(summary_Cord_ITU_n_finalnzeroT$percent),]

summary_Cord_ITU_n_finalnzeroT$number <- seq(1, length(summary_Cord_ITU_n_finalnzeroT$variable))

<!-- rnb-source-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->



<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxucGVyY192YXJzX0NvcmRfSVRVX24gPC0gXG4gIGdncGxvdChzdW1tYXJ5X0NvcmRfSVRVX25fZmluYWxuemVyb1QsIGFlcyhyZW9yZGVyKHZhcmlhYmxlLCBwZXJjZW50KSwgcGVyY2VudCwgZ3JvdXA9MSkpK1xuICBnZW9tX3BvaW50KCkrIGdlb21fbGluZSgpK1xuICB5bGFiKFwiXFxuJSBvY2N1cmVuY2UgaW4gbW9kZWxzIHdpdGggbnplcm8gY29lZmZpY2llbnRzID0gOSAgICBcIikrXG4gIHNjYWxlX3lfY29udGludW91cyhicmVha3M9YygwLjEsMC4yLDAuMywwLjQsMC41LDAuNiwwLjcsMC44LDAuOSkpK1xuICB4bGFiKFwicHJlZGljdG9yXFxuXCIpK1xuICBjb29yZF9mbGlwKCkrXG4gIGdlb21faGxpbmUoeWludGVyY2VwdD0wLjc1LCBsaW5ldHlwZT1cImRvdHRlZFwiKStcbiAgdGhlbWVfYncoKStcbiAgdGhlbWUodGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTUpLCBheGlzLnRpdGxlLng9IGVsZW1lbnRfdGV4dChzaXplPTE1KSwgYXhpcy50aXRsZS55PSBlbGVtZW50X3RleHQoc2l6ZT0xNSkpXG5cbnBlcmNfdmFyc19Db3JkX0lUVV9uXG5cbiMgZGVjaWRlIGZvciBjdXQtb2ZmICUgLT4gaGVyZSAuNzVcblxuRmlsdGVyKGZ1bmN0aW9uKHgpIGFueSh4ID4gMC43NSksIHN1bW1hcnlfQ29yZF9JVFVfbl9maW5hbG56ZXJvWywhYyhcIm5vbi16ZXJvXCIsIFwibWVhbiBjdm1cIiwgXCJtZWRpYW4gY3ZtXCIpXSlcblxuYGBgIn0= -->

```r
perc_vars_Cord_ITU_n <- 
  ggplot(summary_Cord_ITU_n_finalnzeroT, aes(reorder(variable, percent), percent, group=1))+
  geom_point()+ geom_line()+
  ylab("\n% occurence in models with nzero coefficients = 9    ")+
  scale_y_continuous(breaks=c(0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9))+
  xlab("predictor\n")+
  coord_flip()+
  geom_hline(yintercept=0.75, linetype="dotted")+
  theme_bw()+
  theme(text = element_text(size = 15), axis.title.x= element_text(size=15), axis.title.y= element_text(size=15))

perc_vars_Cord_ITU_n

# decide for cut-off % -> here .75

Filter(function(x) any(x > 0.75), summary_Cord_ITU_n_finalnzero[,!c("non-zero", "mean cvm", "median cvm")])
png(filename="Results/Figures/elasticNet_singleTissues/Outcome_main/varsPercent_Cord.png", width=2900, height=1400, res=400)
perc_vars_Cord_ITU_n
dev.off()

A metric of interest could be the width of the confidence intervals about a bootstrapped estimate of the coefficient, when the coefficient is non-zero:

pm2_Cord_ITU_n_coef <-
  dcast(pm2_Cord_ITU_n[,
                       as.list(unlist(
                         lapply(.SD,
                                function(x) {
                                  y <- unname(quantile(x[x != 0], probs = c(0.025, 0.975)))
                                  list("non_zero" = 100 * mean(x != 0),
                                       lcl = y[1],
                                       ucl = y[2],
                                       width = diff(y),
                                       median = median(x[x!= 0]))
                                }))),
                       .SDcols = c("Child_Sexfemale", "Child_Birth_Weight", "Child_Birth_Length", "Child_Head_Circumference_At_Birth", "Delivery_mode_dichotomaided", "Induced_Labouryes", "Parity_dichotomgiven birth before", "Maternal_Age_Years", "Maternal_Body_Mass_Index_in_Early_Pregnancy", "Maternal_Hypertension_dichotomhypertension in current pregnancy", "Maternal_Diabetes_dichotomdiabetes in current pregnancy", "Maternal_Mental_DisordersYes", "smoking_dichotomyes"),
                       by = nzero][order(nzero)] %>%
          melt(id.var = "nzero") %>%
          .[, metric := sub("^.+\\.(.+)$", "\\1", variable)] %>%
          .[, variable := sub("^(.+)\\..+$", "\\1", variable)] %>%
          .[nzero ==nzero_final_cord_itu], nzero+ variable ~ metric, value.var="value")

# get desired order of predictors
pm2_Cord_ITU_n_coef <-
  pm2_Cord_ITU_n_coef[match(c("Child_Sexfemale", "Child_Birth_Weight", "Child_Birth_Length", "Child_Head_Circumference_At_Birth", "Delivery_mode_dichotomaided", "Induced_Labouryes", "Parity_dichotomgiven birth before", "Maternal_Age_Years", "Maternal_Body_Mass_Index_in_Early_Pregnancy", "Maternal_Hypertension_dichotomhypertension in current pregnancy", "Maternal_Diabetes_dichotomdiabetes in current pregnancy", "Maternal_Mental_DisordersYes", "smoking_dichotomyes"), pm2_Cord_ITU_n_coef$variable),]
pm2_Cord_ITU_n_coef$variable <- factor(pm2_Cord_ITU_n_coef$variabl, levels=unique(pm2_Cord_ITU_n_coef$variable))

## NOTE: median is used here instead of mean
# make frame for only significant variables:
pm2_Cord_ITU_n_datable <- dcast(pm2_Cord_ITU_n[,
                                               as.list(unlist(
                                                 lapply(.SD,
                                                        function(x) {
                                                          y <- unname(quantile(x[x != 0], probs = c(0.025, 0.975)))
                                                          list("non_zero" = 100 * mean(x != 0),
                                                               lcl = y[1],
                                                               ucl = y[2],
                                                               width = diff(y),
                                                               median = median(x[x!= 0]))
                                                        }))),
                                               .SDcols = c("Child_Sexfemale", "Child_Birth_Weight", "Child_Birth_Length", "Child_Head_Circumference_At_Birth", "Delivery_mode_dichotomaided", "Induced_Labouryes", "Parity_dichotomgiven birth before", "Maternal_Age_Years", "Maternal_Body_Mass_Index_in_Early_Pregnancy", "Maternal_Hypertension_dichotomhypertension in current pregnancy", "Maternal_Diabetes_dichotomdiabetes in current pregnancy", "Maternal_Mental_DisordersYes", "smoking_dichotomyes"),
                                               by = nzero][order(nzero)] %>%
                                  melt(id.var = "nzero") %>%
                                  .[, metric := sub("^.+\\.(.+)$", "\\1", variable)] %>%
                                  .[, variable := sub("^(.+)\\..+$", "\\1", variable)] %>%
                                  # print %>%
                                  .[nzero == nzero_final_cord_itu & variable %in% sig_var_names_Cord_ITU_n_finalnzero], nzero+ variable ~ metric, value.var="value")

pm2_Cord_ITU_n_datable
```r
write_xlsx(pm2_Cord_ITU_n_coef,\Results/Tables/CoefficientsModel_Cord.xlsx\)

<!-- rnb-source-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->




<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxuc2lnX3ZhcnNfQ29yZF9JVFVfbiA8LVxuICBwbTJfQ29yZF9JVFVfbl9jb2VmICU+JVxuICBnZ3Bsb3QyOjpnZ3Bsb3QoLikgK1xuICBnZ3Bsb3QyOjp0aGVtZV9idygpICtcbiAgZ2dwbG90Mjo6dGhlbWUoYXhpcy50ZXh0Lng9ZWxlbWVudF9ibGFuaygpKStcbiAgZ2dwbG90Mjo6YWVzKHg9XFxuemVyb1xcKStcbiAgZ2dwbG90Mjo6Z2VvbV9wb2ludChtYXBwaW5nID0gZ2dwbG90Mjo6YWVzKHkgPSB2YXJpYWJsZSwgc2l6ZSA9bm9uX3plcm8sIGFscGhhID0gbm9uX3plcm8sIGNvbG9yID0gbm9uX3plcm8pKSArXG4gIGdncGxvdDI6Omdlb21fdGV4dChhZXMoeT12YXJpYWJsZSwgbGFiZWw9c3ByaW50ZihcXCUwLjJmXFwsIHJvdW5kKG1lZGlhbiwgZGlnaXRzPTIpKSwgc2l6ZT01MCksaGp1c3Q9MCwgdmp1c3Q9MC41LCBudWRnZV94ID0gMC4xKStcbiAgZ2dwbG90Mjo6c2NhbGVfY29sb3JfZ3JhZGllbnQyKGhpZ2ggPSAnZ3JlZW4nLCBtaWQgPSBcXHB1cnBsZVxcLCBsb3cgPSBcXGJsYWNrXFwsIG1pZHBvaW50ID01MCkrXG4gIGdncGxvdDI6OnNjYWxlX2FscGhhKGd1aWRlID0gJ25vbmUnKStcbiAgZ2dwbG90Mjo6c2NhbGVfc2l6ZShndWlkZSA9ICdub25lJykrXG4gIGdncGxvdDI6OnNjYWxlX3lfZGlzY3JldGUobGFiZWxzPSBjKFxcY2hpbGQgc2V4IChmZW1hbGUpXFwsIFxcYmlydGggd2VpZ2h0XFwsIFxcYmlydGggbGVuZ3RoXFwsIFxcaGVhZCBjaXJjdW1mZXJlbmNlXFwsIFxcZGVsaXZlcnkgbW9kZSAoYWlkZWQpXFwsIFxcaW5kdWNlZCBsYWJvciAoeWVzKVxcLCBcXHBhcml0eSAoYmlydGggYmVmb3JlKVxcLCBcXG1hdGVybmFsIGFnZVxcLCBcXG1hdGVybmFsIEJNSVxcLCBcXG1hdGVybmFsIGh5cGVydGVuc2lvbiAoeWVzKVxcLCBcXG1hdGVybmFsIGRpYWJldGVzICh5ZXMpXFwsIFxcbWF0ZXJuYWwgbWVudGFsIGRpc29yZGVycyAoeWVzKVxcLCBcXG1hdGVybmFsIHNtb2tpbmcgKHllcylcXCkpK1xuICBnZ3Bsb3QyOjpsYWJzKHk9XFxwcmVkaWN0b3JcXCwgeCA9IFxcbnVtYmVyIG9mIG5vbi16ZXJvIGNvZWZmaWNpZW50cyA9IDlcXCwgY29sb3I9XFwlXFwpXG5cbmBgYFxuYGBgIn0= -->

```r
```r
sig_vars_Cord_ITU_n <-
  pm2_Cord_ITU_n_coef %>%
  ggplot2::ggplot(.) +
  ggplot2::theme_bw() +
  ggplot2::theme(axis.text.x=element_blank())+
  ggplot2::aes(x=\nzero\)+
  ggplot2::geom_point(mapping = ggplot2::aes(y = variable, size =non_zero, alpha = non_zero, color = non_zero)) +
  ggplot2::geom_text(aes(y=variable, label=sprintf(\%0.2f\, round(median, digits=2)), size=50),hjust=0, vjust=0.5, nudge_x = 0.1)+
  ggplot2::scale_color_gradient2(high = 'green', mid = \purple\, low = \black\, midpoint =50)+
  ggplot2::scale_alpha(guide = 'none')+
  ggplot2::scale_size(guide = 'none')+
  ggplot2::scale_y_discrete(labels= c(\child sex (female)\, \birth weight\, \birth length\, \head circumference\, \delivery mode (aided)\, \induced labor (yes)\, \parity (birth before)\, \maternal age\, \maternal BMI\, \maternal hypertension (yes)\, \maternal diabetes (yes)\, \maternal mental disorders (yes)\, \maternal smoking (yes)\))+
  ggplot2::labs(y=\predictor\, x = \number of non-zero coefficients = 9\, color=\%\)

<!-- rnb-source-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->



<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuY29lZl9Db3JkX0lUVV9uIDwtIFxuICBnZ3Bsb3QocG0yX0NvcmRfSVRVX25fY29lZiwgYWVzKHkgPSB2YXJpYWJsZSwgeD1tZWRpYW4pKStcbiAgZ2VvbV9wb2ludChtYXBwaW5nID0gZ2dwbG90Mjo6YWVzKHkgPSB2YXJpYWJsZSwgc2l6ZSA9bm9uX3plcm8sIGFscGhhID0gbm9uX3plcm8sIGNvbG9yID0gbm9uX3plcm8pKStcbiAgc2NhbGVfY29sb3JfZ3JhZGllbnQyKGhpZ2ggPSAnZ3JlZW4nLCBtaWQgPSBcInB1cnBsZVwiLCBsb3cgPSBcImJsYWNrXCIsIG1pZHBvaW50ID01MCwgbGltaXRzPWMoMCwxMDApKStcbiAgc2NhbGVfYWxwaGEoZ3VpZGUgPSAnbm9uZScpK1xuICBzY2FsZV9zaXplKGd1aWRlID0gJ25vbmUnKStcbiAgZ2VvbV9wb2ludCgpK1xuICBnZW9tX2Vycm9yYmFyKGFlcyh5ID0gdmFyaWFibGUsIHhtaW4gPSBsY2wsIHhtYXggPSB1Y2wpLCB3aWR0aCA9IDAuMikrXG4gIGxhYnMoeT1cInByZWRpY3RvclwiLCB4ID0gXCJcXG5tZWRpYW4gJiA5NSUgQ0kgb2YgY29lZmZpY2llbnQgKG92ZXIgYm9vdHN0cmFwcylcIiwgY29sb3I9XCIlXCIpK1xuICBzY2FsZV94X2NvbnRpbnVvdXMobGltaXRzPWMoLTAuNCwwLjQpLCBicmVha3M9YygtLjQsLS4zLC0uMiwgLS4xLCAwLCAuMSwgLjIsIC4zLCAuNCkpK1xuICBzY2FsZV95X2Rpc2NyZXRlKGxhYmVscz0gYyhcImNoaWxkIHNleCAoZmVtYWxlKVwiLCBcImJpcnRoIHdlaWdodFwiLCBcImJpcnRoIGxlbmd0aFwiLCBcImhlYWQgY2lyY3VtZmVyZW5jZVwiLCBcImRlbGl2ZXJ5IG1vZGUgKGFpZGVkKVwiLCBcImluZHVjZWQgbGFib3IgKHllcylcIiwgXCJwYXJpdHkgKGJpcnRoIGJlZm9yZSlcIiwgXCJtYXRlcm5hbCBhZ2VcIiwgXCJtYXRlcm5hbCBCTUlcIiwgXCJtYXRlcm5hbCBoeXBlcnRlbnNpb24gKHllcylcIiwgXCJtYXRlcm5hbCBkaWFiZXRlcyAoeWVzKVwiLCBcIm1hdGVybmFsIG1lbnRhbCBkaXNvcmRlcnMgKHllcylcIiwgXCJtYXRlcm5hbCBzbW9raW5nICh5ZXMpXCIpKStcbiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0PTAsIGxpbmV0eXBlPVwiZGFzaGVkXCIpK1xuICB0aGVtZV9idygpK1xuICB0aGVtZSh0ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNSksIGF4aXMudGl0bGUueD0gZWxlbWVudF90ZXh0KHNpemU9MTUpLCBheGlzLnRpdGxlLnk9IGVsZW1lbnRfdGV4dChzaXplPTE1KSlcblxuXG5jb2VmX0NvcmRfSVRVX24gXG5gYGAifQ== -->

```r
coef_Cord_ITU_n <- 
  ggplot(pm2_Cord_ITU_n_coef, aes(y = variable, x=median))+
  geom_point(mapping = ggplot2::aes(y = variable, size =non_zero, alpha = non_zero, color = non_zero))+
  scale_color_gradient2(high = 'green', mid = "purple", low = "black", midpoint =50, limits=c(0,100))+
  scale_alpha(guide = 'none')+
  scale_size(guide = 'none')+
  geom_point()+
  geom_errorbar(aes(y = variable, xmin = lcl, xmax = ucl), width = 0.2)+
  labs(y="predictor", x = "\nmedian & 95% CI of coefficient (over bootstraps)", color="%")+
  scale_x_continuous(limits=c(-0.4,0.4), breaks=c(-.4,-.3,-.2, -.1, 0, .1, .2, .3, .4))+
  scale_y_discrete(labels= c("child sex (female)", "birth weight", "birth length", "head circumference", "delivery mode (aided)", "induced labor (yes)", "parity (birth before)", "maternal age", "maternal BMI", "maternal hypertension (yes)", "maternal diabetes (yes)", "maternal mental disorders (yes)", "maternal smoking (yes)"))+
  geom_vline(xintercept=0, linetype="dashed")+
  theme_bw()+
  theme(text = element_text(size = 15), axis.title.x= element_text(size=15), axis.title.y= element_text(size=15))


coef_Cord_ITU_n 
png(filename="Results/Figures/elasticNet_singleTissues/Outcome_main/coef_Cord.png", width=2800, height=1400, res=400)
coef_Cord_ITU_n 
dev.off()
p1 <-
  csummary_Cord_ITU_n %>%
  melt(id.vars = c("nzero", "mean_cvm", "median_cvm")) %>%
  ggplot2::ggplot(.) +
  ggplot2::theme_bw() +
  ggplot2::aes(x = nzero) +
  ggplot2::geom_point(mapping = ggplot2::aes(y = variable, size = value, alpha = value, color = value*100)) +
  ggplot2::scale_color_gradient2(high = 'green', mid = "purple", low = "black", midpoint =50)+
  ggplot2::scale_alpha(guide = 'none')+
  ggplot2::scale_size(guide = 'none')+
  ggplot2::scale_y_discrete(labels= c("child sex (female)", "birth weight", "birth length", "head circumference", "delivery mode (aided)", "induced labor (yes)", "parity (birth before)", "maternal age", "maternal BMI", "maternal hypertension (yes)", "maternal diabetes (yes)", "maternal mental disorders (yes)", "maternal smoking (yes)"))+
  ggplot2::scale_x_continuous(breaks=0:14, labels=)+
  ggplot2::labs(y="predictor\n", x = "\nnumber of non-zero coefficients", color="%")+
  ggplot2::theme(text = element_text(size = 17), axis.title.x= element_text(size=15), axis.title.y= element_text(size=15), legend.position = "none")
  
p2 <- 
  ggplot(pm2_Cord_ITU_n_coef, aes(y = variable, x=median))+
  geom_point(mapping = ggplot2::aes(y = variable, size =non_zero, alpha = non_zero, color = non_zero))+
  scale_color_gradient2(high = 'green', mid = "purple", low = "black", midpoint =50, limits=c(0,100))+
  scale_alpha(guide = 'none')+
  scale_size(guide = 'none')+
  geom_point()+
  geom_errorbar(aes(y = variable, xmin = lcl, xmax = ucl), width = 0.2)+
  labs(y="", x = "\nmedian & 95% CI of coefficient (over bootstraps)", color="%")+
  scale_x_continuous(limits=c(-0.4,0.4), breaks=c(-.4,-.3,-.2, -.1, 0, .1, .2, .3, .4))+
  scale_y_discrete(labels= c("child sex (female)", "birth weight", "birth length", "head circumference", "delivery mode (aided)", "induced labor (yes)", "parity (birth before)", "maternal age", "maternal BMI", "maternal hypertension (yes)", "maternal diabetes (yes)", "maternal mental disorders (yes)", "maternal smoking (yes)"))+
  geom_vline(xintercept=0, linetype="dashed")+
   ggtitle("nzero = 9")+
  theme_bw()+
 theme(text = element_text(size = 17), axis.title.x= element_text(size=15), axis.title.y= element_text(size=15), plot.title = element_text(size=15), axis.text.y=element_blank())

g1 <- ggplotGrob(p1)
g2 <- ggplotGrob(p2)
g <- cbind(g1, g2, size = "last")
g$heights <- unit.pmax(g1$heights, g2$heights)

png(filename="Results/Figures/elasticNet_singleTissues/Outcome_main/Model_coef_Cord.png", width=5800, height=1600, res=400)
grid.draw(g)
dev.off()

get the beta values

```r
### Code for only including \significant variables\ in the beta vector, based on VIP (>75% not-zero in bootstraps)

# get median beta values of the 1000 bootstraps for the model with 9 non-zero coefficients
Beta_hat_s_cord_n <- matrix(miscTools::colMedians(pm2_Cord_ITU_n[nzero == nzero_final_cord_itu, .SD, .SDcols = c(\(Intercept)\,sig_var_names_Cord_ITU_n_finalnzero)]), ncol = 1)
# intenept and variable beta values
# NOTE that median is used here
rownames(Beta_hat_s_cord_n) <- c(\Intercept\, sig_var_names_Cord_ITU_n_finalnzero)

Beta_Cord_ITU_n <- Beta_hat_s_cord_n

<!-- rnb-source-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->



<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxuc2F2ZShCZXRhX0NvcmRfSVRVX24sIGZpbGU9XFxJbnB1dERhdGEvRGF0YV9FbGFzdGljTmV0cy9CZXRhX0NvcmRfSVRVX24uUmRhdGFcXClcbmBgYFxuYGBgIn0= -->

```r
```r
save(Beta_Cord_ITU_n, file=\InputData/Data_ElasticNets/Beta_Cord_ITU_n.Rdata\)

<!-- rnb-source-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->


[to the top](#top)

## Cord blood elastic net {#elasticnetCordITU_a}  
additional model, with alcohol variable


<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxuIyBpbiBjYXNlIHlvdSB3YW50IHRvIHN0YXJ0IGZyb20gaGVyZVxubG9hZChcXElucHV0RGF0YS9DbG9ja0NhbGN1bGF0aW9uc0lucHV0L1JlZ19JbnB1dF9EYXRhX0NvcmRfSVRVX0VBQVJfbm9OYV93YS5SZGF0YVxcKVxuYGBgXG5gYGAifQ== -->

```r
```r
# in case you want to start from here
load(\InputData/ClockCalculationsInput/Reg_Input_Data_Cord_ITU_EAAR_noNa_wa.Rdata\)

<!-- rnb-source-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->



<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxueXJjX21hdF9JVFVfQ29yZF93YSA8LSBtYXRyaXgoUmVnX0lucHV0X0RhdGFfQ29yZF9JVFVfRUFBUl9ub05hX3dhJEVBQVJfQm9obGluKVxueHJjX21hdF9JVFVfQ29yZF93YSA8LSBtb2RlbC5tYXRyaXgoIH4gLiAtIEVBQVJfQm9obGluLCBkYXRhID0gUmVnX0lucHV0X0RhdGFfQ29yZF9JVFVfRUFBUl9ub05hX3dhKVssIC0xXVxueXJjX21hdF9JVFVfc2NhbGVkX0NvcmRfd2EgPC0gc2NhbGUoeXJjX21hdF9JVFVfQ29yZF93YSlcbnhyY19tYXRfSVRVX3NjYWxlZF9Db3JkX3dhIDwtIHNjYWxlKHhyY19tYXRfSVRVX0NvcmRfd2EpXG5gYGBcbmBgYCJ9 -->

```r
```r
yrc_mat_ITU_Cord_wa <- matrix(Reg_Input_Data_Cord_ITU_EAAR_noNa_wa$EAAR_Bohlin)
xrc_mat_ITU_Cord_wa <- model.matrix( ~ . - EAAR_Bohlin, data = Reg_Input_Data_Cord_ITU_EAAR_noNa_wa)[, -1]
yrc_mat_ITU_scaled_Cord_wa <- scale(yrc_mat_ITU_Cord_wa)
xrc_mat_ITU_scaled_Cord_wa <- scale(xrc_mat_ITU_Cord_wa)

<!-- rnb-source-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->


<!-- set seed -->
<!-- ```{r} -->
<!-- set.seed(2020) -->
<!-- ``` -->


<!-- ```{r, warning=F} -->
<!--   nboot = 1000 -->

<!--   start_time <- Sys.time() -->
<!--   bootstraps_Cord_ITU_wa <- replicate(nboot, { -->
<!--     rws <- sample(1:nrow(xrc_mat_ITU_scaled_Cord_wa), replace = TRUE) -->
<!--     ensr(xrc_mat_ITU_scaled_Cord_wa[rws, ], yrc_mat_ITU_scaled_Cord_wa[rws, ], standardized = FALSE, family="gaussian", nlambda=100, nfolds=10, alpha=c(0.0,0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1.0)) -->
<!--   }, -->
<!--   simplify = FALSE) -->

<!--   end_time <- Sys.time() -->
<!--   end_time - start_time -->

<!-- ``` -->

<!-- ```{r} -->
<!-- save(bootstraps_Cord_ITU_wa, file="InputData/Data_ElasticNets/bootstraps_Cord_ITU_wa_1000.Rdata") -->
<!-- ``` -->



<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxubG9hZChcXElucHV0RGF0YS9EYXRhX0VsYXN0aWNOZXRzL2Jvb3RzdHJhcHNfQ29yZF9JVFVfd2FfMTAwMC5SZGF0YVxcKVxuYGBgXG5gYGAifQ== -->

```r
```r
load(\InputData/Data_ElasticNets/bootstraps_Cord_ITU_wa_1000.Rdata\)

<!-- rnb-source-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->



<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuc3VtbWFyaWVzX0NvcmRfSVRVX3dhIDwtXG4gIGJvb3RzdHJhcHNfQ29yZF9JVFVfd2EgJT4lXG4gIGxhcHBseShzdW1tYXJ5KSAlPiVcbiAgcmJpbmRsaXN0KGlkY29sID0gXCJib290c3RyYXBcIilcblxuc3VtbWFyaWVzX0NvcmRfSVRVX3dhXG5gYGAifQ== -->

```r
summaries_Cord_ITU_wa <-
  bootstraps_Cord_ITU_wa %>%
  lapply(summary) %>%
  rbindlist(idcol = "bootstrap")

summaries_Cord_ITU_wa
summaries_Cord_ITU_wa[, .SD[cvm == min(cvm)], by = c("bootstrap", "nzero")] %>%
  ggplot2::ggplot(data = .) +
  ggplot2::aes(x = nzero, y = cvm, group = bootstrap) +
  ggplot2::geom_point() +
  ggplot2::geom_line()
png(filename="Results/Figures/elasticNet_singleTissues/Outcome_add/alcohol/bootstraps_Cord.png", width=800, height=600)
summaries_Cord_ITU_wa[, .SD[cvm == min(cvm)], by = c("bootstrap", "nzero")] %>%
  ggplot2::ggplot(data = .) +
  ggplot2::aes(x = nzero, y = cvm, group = bootstrap) +
  ggplot2::geom_point() +
  ggplot2::geom_line()
dev.off()
```r
load(\InputData/Data_ElasticNets/pm2_Cord_ITU_wa.Rdata\)
# coefficient values for the models with smallest cvm by number of non-erzo coefficients and bootstrap

<!-- rnb-source-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->



<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuY3N1bW1hcnlfQ29yZF9JVFVfd2EgPC0gUmVkdWNlKGZ1bmN0aW9uKHgseSkgbWVyZ2UoeCA9IHgsIHkgPSB5LCBieSA9IFwibnplcm9cIiksIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3QocG0yX0NvcmRfSVRVX3dhWywgbGFwcGx5KC5TRCwgZnVuY3Rpb24oeCkge21lYW4oeCAhPSAwKX0pLCAuU0Rjb2xzID0gYyhcIkNoaWxkX1NleGZlbWFsZVwiLCBcIkNoaWxkX0JpcnRoX1dlaWdodFwiLCBcIkNoaWxkX0JpcnRoX0xlbmd0aFwiLCBcIkNoaWxkX0hlYWRfQ2lyY3VtZmVyZW5jZV9BdF9CaXJ0aFwiLCBcIkRlbGl2ZXJ5X21vZGVfZGljaG90b21haWRlZFwiLCBcIkluZHVjZWRfTGFib3VyeWVzXCIsIFwiUGFyaXR5X2RpY2hvdG9tZ2l2ZW4gYmlydGggYmVmb3JlXCIsIFwiTWF0ZXJuYWxfQWdlX1llYXJzXCIsIFwiTWF0ZXJuYWxfQm9keV9NYXNzX0luZGV4X2luX0Vhcmx5X1ByZWduYW5jeVwiLCBcIk1hdGVybmFsX0h5cGVydGVuc2lvbl9kaWNob3RvbWh5cGVydGVuc2lvbiBpbiBjdXJyZW50IHByZWduYW5jeVwiLCBcIk1hdGVybmFsX0RpYWJldGVzX2RpY2hvdG9tZGlhYmV0ZXMgaW4gY3VycmVudCBwcmVnbmFuY3lcIiwgXCJNYXRlcm5hbF9NZW50YWxfRGlzb3JkZXJzWWVzXCIsIFwic21va2luZ19kaWNob3RvbXllc1wiLCBcIm1hdGVybmFsX2FsY29ob2xfdXNleWVzXCIpLCBieSA9IG56ZXJvXVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG0yX0NvcmRfSVRVX3dhWywgLihtZWFuX2N2bSA9IG1lYW4oY3ZtKSksIGJ5ID0gbnplcm9dLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG0yX0NvcmRfSVRVX3dhWywgLihtZWRpYW5fY3ZtID0gbWVkaWFuKGN2bSkpLCBieSA9IG56ZXJvXVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkpW29yZGVyKG56ZXJvKV1cblxuY3N1bW1hcnlfQ29yZF9JVFVfd2FcbmBgYCJ9 -->

```r
csummary_Cord_ITU_wa <- Reduce(function(x,y) merge(x = x, y = y, by = "nzero"), 
                               list(pm2_Cord_ITU_wa[, lapply(.SD, function(x) {mean(x != 0)}), .SDcols = c("Child_Sexfemale", "Child_Birth_Weight", "Child_Birth_Length", "Child_Head_Circumference_At_Birth", "Delivery_mode_dichotomaided", "Induced_Labouryes", "Parity_dichotomgiven birth before", "Maternal_Age_Years", "Maternal_Body_Mass_Index_in_Early_Pregnancy", "Maternal_Hypertension_dichotomhypertension in current pregnancy", "Maternal_Diabetes_dichotomdiabetes in current pregnancy", "Maternal_Mental_DisordersYes", "smoking_dichotomyes", "maternal_alcohol_useyes"), by = nzero]
                                    ,
                                    pm2_Cord_ITU_wa[, .(mean_cvm = mean(cvm)), by = nzero],
                                    pm2_Cord_ITU_wa[, .(median_cvm = median(cvm)), by = nzero]
                               ))[order(nzero)]

csummary_Cord_ITU_wa
g1_Cord_ITU_wa <-
  csummary_Cord_ITU_wa %>%
  melt(id.vars = c("nzero", "mean_cvm", "median_cvm")) %>%
  ggplot2::ggplot(.) +
  ggplot2::theme_bw() +
  ggplot2::aes(x = nzero) +
  ggplot2::geom_point(mapping = ggplot2::aes(y = variable, size = value, alpha = value, color = value*100)) +
  ggplot2::scale_color_gradient2(high = 'green', mid = "purple", low = "black", midpoint =50)+
  ggplot2::scale_alpha(guide = 'none')+
  ggplot2::scale_size(guide = 'none')+
  ggplot2::scale_y_discrete(labels= c("child sex", "birth weight", "birth length", "head circumference", "delivery mode", "induced labor", "parity", "maternal age", "maternal BMI", "maternal hypertension", "maternal diabetes", "maternal mental disorders", "maternal smoking", "maternal alcohol use"))+
  ggplot2::scale_x_continuous(breaks=0:14, labels=)+
  ggplot2::labs(y="predictor", x = "number of non-zero coefficients", color="%")+
  ggplot2::theme(text = element_text(size = 15), axis.title.x= element_text(size=15), axis.title.y= element_text(size=15))

g2_Cord_ITU_wa <-
  csummary_Cord_ITU_wa %>%
  ggplot2::ggplot(.) +
  ggplot2::theme_bw() +
  ggplot2::aes(x = nzero, y = median_cvm) +
  ggplot2::geom_point() + ggplot2::geom_line()+
  ggplot2::labs(y="median cvm", x = "number of non-zero coefficients")+
  ggplot2::scale_x_continuous(breaks=0:14, labels=)+
  ggplot2::theme(axis.text=element_text(size=15),axis.title=element_text(size=18))

gridExtra::grid.arrange(g1_Cord_ITU_wa, g2_Cord_ITU_wa, ncol = 1)
png(filename="Results/Figures/elasticNet_singleTissues/Outcome_add/alcohol/bootstrapModels_Cord.png", width=2400, height=1800, res=300)
gridExtra::grid.arrange(g1_Cord_ITU_wa, g2_Cord_ITU_wa, ncol = 1)
dev.off()
png(filename="Results/Figures/elasticNet_singleTissues/Outcome_add/alcohol/Model_Cord.png", width=2800, height=1400, res=400)
g1_Cord_ITU_wa
dev.off()
elbow_finder(csummary_Cord_ITU_wa$nzero, csummary_Cord_ITU_wa$median_cvm)

nzero_indices_Cord <- data.frame(t(elbow_finder(csummary_Cord_ITU_wa$nzero, csummary_Cord_ITU_wa$median_cvm)))
colnames(nzero_indices_Cord) <- c("x", "y")
rownames(nzero_indices_Cord) <- NULL
```r
nzero_final_cord_wa <- 7

<!-- rnb-source-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->


look at models with final non-zero coefficient.

<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuY3N1bW1hcnlfQ29yZF9JVFVfd2Fbbnplcm8gJWluJSBuemVyb19maW5hbF9jb3JkX3dhXVxuYGBgIn0= -->

```r
csummary_Cord_ITU_wa[nzero %in% nzero_final_cord_wa]
nonzero_choose_Cord <- ggplot2::ggplot(csummary_Cord_ITU_wa) +
  ggplot2::theme_bw()+
  ggplot2::aes(x = nzero, y = median_cvm) +
  ggplot2::scale_x_continuous(breaks=c(0:17))+
  ggplot2::geom_point() + ggplot2::geom_line()+
  ggplot2::geom_point(data=nzero_indices_Cord, aes(x=x, y=y), colour="red", size=2)+
  ggplot2::ylab("median of minimum cross-validation errors over bootstraps")+
  ggplot2::xlab("number of non-zero coefficients")+
  ggplot2::geom_segment(aes(x = nzero[1], y = median_cvm[1], xend = nzero[15], yend = median_cvm[15], colour = "segment"), data = csummary_Cord_ITU_wa, show.legend = F)

nonzero_choose_Cord
png(filename="Results/Figures/elasticNet_singleTissues/Outcome_add/alcohol/nzero_choose_Cord.png", width=1600, height=1400, res=300)
nonzero_choose_Cord
dev.off()
```r
summary_Cord_ITU_wa_finalnzero <- csummary_Cord_ITU_wa[nzero %in% nzero_final_cord_wa]
sig_var_names_Cord_ITU_wa_finalnzero <- Filter(function(x) any(x > 0.75), summary_Cord_ITU_wa_finalnzero[,!c(\nzero\, \mean_cvm\, \median_cvm\)]) %>% colnames()
colnames(summary_Cord_ITU_wa_finalnzero) <- c(\non-zero\, \child sex (female)\, \birth weight\, \birth length\, \head circumference\, \delivery mode (aided)\, \induced labor (yes)\, \parity (birth before)\, \maternal age\, \maternal BMI\, \maternal hypertension (yes)\, \maternal diabetes (yes)\, \maternal mental disorders (yes)\, \maternal smoking (yes)\, \maternal alcohol use (yes)\, \mean cvm\, \median cvm\)
summary_Cord_ITU_wa_finalnzeroT <- as.data.frame(t(summary_Cord_ITU_wa_finalnzero[,-c(\non-zero\, \median cvm\, \mean cvm\)]))
summary_Cord_ITU_wa_finalnzeroT$variable <- rownames(summary_Cord_ITU_wa_finalnzeroT)
rownames(summary_Cord_ITU_wa_finalnzeroT) <- NULL
names(summary_Cord_ITU_wa_finalnzeroT)[names(summary_Cord_ITU_wa_finalnzeroT) == 'V1'] <- 'percent'
summary_Cord_ITU_wa_finalzeroT <- summary_Cord_ITU_wa_finalnzeroT[order(summary_Cord_ITU_wa_finalnzeroT$percent),]

summary_Cord_ITU_wa_finalnzeroT$number <- seq(1, length(summary_Cord_ITU_wa_finalnzeroT$variable))

<!-- rnb-source-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->



<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxucGVyY192YXJzX0NvcmRfSVRVX3dhIDwtIFxuICBnZ3Bsb3Qoc3VtbWFyeV9Db3JkX0lUVV93YV9maW5hbG56ZXJvVCwgYWVzKHJlb3JkZXIodmFyaWFibGUsIHBlcmNlbnQpLCBwZXJjZW50LCBncm91cD0xKSkrXG4gIGdlb21fcG9pbnQoKSsgZ2VvbV9saW5lKCkrXG4gIHlsYWIoXCIlIG9jY3VyZW5jZSBpbiBtb2RlbHMgd2l0aCBuemVybyBjb2VmZmljaWVudHMgPSA4XCIpK1xuICBzY2FsZV95X2NvbnRpbnVvdXMoYnJlYWtzPWMoMC4xLDAuMiwwLjMsMC40LDAuNSwwLjYsMC43LDAuOCwwLjkpKStcbiAgeGxhYihcInZhcmlhYmxlXCIpK1xuICBjb29yZF9mbGlwKCkrXG4gIGdlb21faGxpbmUoeWludGVyY2VwdD0wLjc1LCBsaW5ldHlwZT1cImRvdHRlZFwiKStcbiAgdGhlbWVfYncoKVxuXG5wZXJjX3ZhcnNfQ29yZF9JVFVfd2FcblxuIyBkZWNpZGUgZm9yIGN1dC1vZmYgJSAtPiBoZXJlIC43NVxuXG5GaWx0ZXIoZnVuY3Rpb24oeCkgYW55KHggPiAwLjc1KSwgc3VtbWFyeV9Db3JkX0lUVV93YV9maW5hbG56ZXJvWywhYyhcIm5vbi16ZXJvXCIsIFwibWVhbiBjdm1cIiwgXCJtZWRpYW4gY3ZtXCIpXSlcblxuYGBgIn0= -->

```r
perc_vars_Cord_ITU_wa <- 
  ggplot(summary_Cord_ITU_wa_finalnzeroT, aes(reorder(variable, percent), percent, group=1))+
  geom_point()+ geom_line()+
  ylab("% occurence in models with nzero coefficients = 8")+
  scale_y_continuous(breaks=c(0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9))+
  xlab("variable")+
  coord_flip()+
  geom_hline(yintercept=0.75, linetype="dotted")+
  theme_bw()

perc_vars_Cord_ITU_wa

# decide for cut-off % -> here .75

Filter(function(x) any(x > 0.75), summary_Cord_ITU_wa_finalnzero[,!c("non-zero", "mean cvm", "median cvm")])
png(filename="Results/Figures/elasticNet_singleTissues/Outcome_add/alcohol/varsPercent_Cord.png", width=1100, height=1400, res=300)
perc_vars_Cord_ITU_wa
dev.off()
pm2_Cord_ITU_wa_coef <-
  dcast(pm2_Cord_ITU_wa[,
                       as.list(unlist(
                         lapply(.SD,
                                function(x) {
                                  y <- unname(quantile(x[x != 0], probs = c(0.025, 0.975)))
                                  list("non_zero" = 100 * mean(x != 0),
                                       lcl = y[1],
                                       ucl = y[2],
                                       width = diff(y),
                                       median = median(x[x!= 0]))
                                }))),
                       .SDcols = c("Child_Sexfemale", "Child_Birth_Weight", "Child_Birth_Length", "Child_Head_Circumference_At_Birth", "Delivery_mode_dichotomaided", "Induced_Labouryes", "Parity_dichotomgiven birth before", "Maternal_Age_Years", "Maternal_Body_Mass_Index_in_Early_Pregnancy", "Maternal_Hypertension_dichotomhypertension in current pregnancy", "Maternal_Diabetes_dichotomdiabetes in current pregnancy", "Maternal_Mental_DisordersYes", "smoking_dichotomyes", "maternal_alcohol_useyes"),
                       by = nzero][order(nzero)] %>%
          melt(id.var = "nzero") %>%
          .[, metric := sub("^.+\\.(.+)$", "\\1", variable)] %>%
          .[, variable := sub("^(.+)\\..+$", "\\1", variable)] %>%
          .[nzero ==nzero_final_cord_wa], nzero+ variable ~ metric, value.var="value")

# get desired order of predictors
pm2_Cord_ITU_wa_coef <-
  pm2_Cord_ITU_wa_coef[match(c("Child_Sexfemale", "Child_Birth_Weight", "Child_Birth_Length", "Child_Head_Circumference_At_Birth", "Delivery_mode_dichotomaided", "Induced_Labouryes", "Parity_dichotomgiven birth before", "Maternal_Age_Years", "Maternal_Body_Mass_Index_in_Early_Pregnancy", "Maternal_Hypertension_dichotomhypertension in current pregnancy", "Maternal_Diabetes_dichotomdiabetes in current pregnancy", "Maternal_Mental_DisordersYes", "smoking_dichotomyes", "maternal_alcohol_useyes"), pm2_Cord_ITU_wa_coef$variable),]
pm2_Cord_ITU_wa_coef$variable <- factor(pm2_Cord_ITU_wa_coef$variabl, levels=unique(pm2_Cord_ITU_wa_coef$variable))

## NOTE: median is used here instead of mean
# make frame for only significant variables:
pm2_Cord_ITU_wa_datable <- dcast(pm2_Cord_ITU_wa[,
                                               as.list(unlist(
                                                 lapply(.SD,
                                                        function(x) {
                                                          y <- unname(quantile(x[x != 0], probs = c(0.025, 0.975)))
                                                          list("non_zero" = 100 * mean(x != 0),
                                                               lcl = y[1],
                                                               ucl = y[2],
                                                               width = diff(y),
                                                               median = median(x[x!= 0]))
                                                        }))),
                                               .SDcols = c("Child_Sexfemale", "Child_Birth_Weight", "Child_Birth_Length", "Child_Head_Circumference_At_Birth", "Delivery_mode_dichotomaided", "Induced_Labouryes", "Parity_dichotomgiven birth before", "Maternal_Age_Years", "Maternal_Body_Mass_Index_in_Early_Pregnancy", "Maternal_Hypertension_dichotomhypertension in current pregnancy", "Maternal_Diabetes_dichotomdiabetes in current pregnancy", "Maternal_Mental_DisordersYes", "smoking_dichotomyes", "maternal_alcohol_useyes"),
                                               by = nzero][order(nzero)] %>%
                                  melt(id.var = "nzero") %>%
                                  .[, metric := sub("^.+\\.(.+)$", "\\1", variable)] %>%
                                  .[, variable := sub("^(.+)\\..+$", "\\1", variable)] %>%
                                  # print %>%
                                  .[nzero == nzero_final_cord_wa & variable %in% sig_var_names_Cord_ITU_wa_finalnzero], nzero+ variable ~ metric, value.var="value")

pm2_Cord_ITU_wa_datable
```r
sig_vars_Cord_ITU_wa <-
  pm2_Cord_ITU_wa_coef %>%
  ggplot2::ggplot(.) +
  ggplot2::theme_bw() +
  ggplot2::theme(axis.text.x=element_blank())+
  ggplot2::aes(x=\nzero\)+
  ggplot2::geom_point(mapping = ggplot2::aes(y = variable, size =non_zero, alpha = non_zero, color = non_zero)) +
  ggplot2::geom_text(aes(y=variable, label=sprintf(\%0.2f\, round(median, digits=2)), size=50),hjust=0, vjust=0.5, nudge_x = 0.1)+
  ggplot2::scale_color_gradient2(high = 'green', mid = \purple\, low = \black\, midpoint =50)+
  ggplot2::scale_alpha(guide = 'none')+
  ggplot2::scale_size(guide = 'none')+
  ggplot2::scale_y_discrete(labels= c(\child sex (female)\, \birth weight\, \birth length\, \head circumference\, \delivery mode (aided)\, \induced labor (yes)\, \parity (birth before)\, \maternal age\, \maternal BMI\, \maternal hypertension (yes)\, \maternal diabetes (yes)\, \maternal mental disorders (yes)\, \maternal smoking (yes)\, \maternal alcohol use (yes)\))+
  ggplot2::labs(y=\predictor\, x = \number of non-zero coefficients = 8\, color=\%\)

<!-- rnb-source-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->



<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuY29lZl9Db3JkX0lUVV93YSA8LSBcbiAgZ2dwbG90KHBtMl9Db3JkX0lUVV93YV9jb2VmLCBhZXMoeSA9IHZhcmlhYmxlLCB4PW1lZGlhbikpK1xuICBnZW9tX3BvaW50KG1hcHBpbmcgPSBnZ3Bsb3QyOjphZXMoeSA9IHZhcmlhYmxlLCBzaXplID1ub25femVybywgYWxwaGEgPSBub25femVybywgY29sb3IgPSBub25femVybykpK1xuICBzY2FsZV9jb2xvcl9ncmFkaWVudDIoaGlnaCA9ICdncmVlbicsIG1pZCA9IFwicHVycGxlXCIsIGxvdyA9IFwiYmxhY2tcIiwgbWlkcG9pbnQgPTUwLCBsaW1pdHM9YygwLDEwMCkpK1xuICBzY2FsZV9hbHBoYShndWlkZSA9ICdub25lJykrXG4gIHNjYWxlX3NpemUoZ3VpZGUgPSAnbm9uZScpK1xuICBnZW9tX3BvaW50KCkrXG4gIGdlb21fZXJyb3JiYXIoYWVzKHkgPSB2YXJpYWJsZSwgeG1pbiA9IGxjbCwgeG1heCA9IHVjbCksIHdpZHRoID0gMC4yKStcbiAgbGFicyh5PVwicHJlZGljdG9yXCIsIHggPSBcIlxcbm1lZGlhbiAmIDk1JSBDSSBvZiBjb2VmZmljaWVudCAob3ZlciBib290c3RyYXBzKVwiLCBjb2xvcj1cIiVcIikrXG4gIHNjYWxlX3hfY29udGludW91cyhsaW1pdHM9YygtMC40LDAuNCksIGJyZWFrcz1jKC0uNCwtLjMsLS4yLCAtLjEsIDAsIC4xLCAuMiwgLjMsIC40KSkrXG4gIHNjYWxlX3lfZGlzY3JldGUobGFiZWxzPSBjKFwiY2hpbGQgc2V4IChmZW1hbGUpXCIsIFwiYmlydGggd2VpZ2h0XCIsIFwiYmlydGggbGVuZ3RoXCIsIFwiaGVhZCBjaXJjdW1mZXJlbmNlXCIsIFwiZGVsaXZlcnkgbW9kZSAoYWlkZWQpXCIsIFwiaW5kdWNlZCBsYWJvciAoeWVzKVwiLCBcInBhcml0eSAoYmlydGggYmVmb3JlKVwiLCBcIm1hdGVybmFsIGFnZVwiLCBcIm1hdGVybmFsIEJNSVwiLCBcIm1hdGVybmFsIGh5cGVydGVuc2lvbiAoeWVzKVwiLCBcIm1hdGVybmFsIGRpYWJldGVzICh5ZXMpXCIsIFwibWF0ZXJuYWwgbWVudGFsIGRpc29yZGVycyAoeWVzKVwiLCBcIm1hdGVybmFsIHNtb2tpbmcgKHllcylcIiwgXCJtYXRlcm5hbCBhbGNvaG9sIHVzZSAoeWVzKVwiKSkrXG4gIGdlb21fdmxpbmUoeGludGVyY2VwdD0wLCBsaW5ldHlwZT1cImRhc2hlZFwiKStcbiAgdGhlbWVfYncoKStcbiAgdGhlbWUodGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTUpLCBheGlzLnRpdGxlLng9IGVsZW1lbnRfdGV4dChzaXplPTE1KSwgYXhpcy50aXRsZS55PSBlbGVtZW50X3RleHQoc2l6ZT0xNSkpXG5cblxuY29lZl9Db3JkX0lUVV93YSBcbmBgYCJ9 -->

```r
coef_Cord_ITU_wa <- 
  ggplot(pm2_Cord_ITU_wa_coef, aes(y = variable, x=median))+
  geom_point(mapping = ggplot2::aes(y = variable, size =non_zero, alpha = non_zero, color = non_zero))+
  scale_color_gradient2(high = 'green', mid = "purple", low = "black", midpoint =50, limits=c(0,100))+
  scale_alpha(guide = 'none')+
  scale_size(guide = 'none')+
  geom_point()+
  geom_errorbar(aes(y = variable, xmin = lcl, xmax = ucl), width = 0.2)+
  labs(y="predictor", x = "\nmedian & 95% CI of coefficient (over bootstraps)", color="%")+
  scale_x_continuous(limits=c(-0.4,0.4), breaks=c(-.4,-.3,-.2, -.1, 0, .1, .2, .3, .4))+
  scale_y_discrete(labels= c("child sex (female)", "birth weight", "birth length", "head circumference", "delivery mode (aided)", "induced labor (yes)", "parity (birth before)", "maternal age", "maternal BMI", "maternal hypertension (yes)", "maternal diabetes (yes)", "maternal mental disorders (yes)", "maternal smoking (yes)", "maternal alcohol use (yes)"))+
  geom_vline(xintercept=0, linetype="dashed")+
  theme_bw()+
  theme(text = element_text(size = 15), axis.title.x= element_text(size=15), axis.title.y= element_text(size=15))


coef_Cord_ITU_wa 
png(filename="Results/Figures/elasticNet_singleTissues/Outcome_add/alcohol/coef_Cord.png", width=2800, height=1400, res=400)
coef_Cord_ITU_wa 
dev.off()
p1 <-
  csummary_Cord_ITU_wa %>%
  melt(id.vars = c("nzero", "mean_cvm", "median_cvm")) %>%
  ggplot2::ggplot(.) +
  ggplot2::theme_bw() +
  ggplot2::aes(x = nzero) +
  ggplot2::geom_point(mapping = ggplot2::aes(y = variable, size = value, alpha = value, color = value*100)) +
  ggplot2::scale_color_gradient2(high = 'green', mid = "purple", low = "black", midpoint =50)+
  ggplot2::scale_alpha(guide = 'none')+
  ggplot2::scale_size(guide = 'none')+
  ggplot2::scale_y_discrete(labels= c("child sex (female)", "birth weight", "birth length", "head circumference", "delivery mode (aided)", "induced labor (yes)", "parity (birth before)", "maternal age", "maternal BMI", "maternal hypertension (yes)", "maternal diabetes (yes)", "maternal mental disorders (yes)", "maternal smoking (yes)", "maternal alcohol use (yes)"))+
  ggplot2::scale_x_continuous(breaks=0:14, labels=)+
  ggplot2::labs(y="predictor", x = "\nnumber of non-zero coefficients", color="%")+
  ggplot2::theme(text = element_text(size = 17), axis.title.x= element_text(size=15), axis.title.y= element_text(size=15), legend.position = "none")
  
p2 <- 
  ggplot(pm2_Cord_ITU_wa_coef, aes(y = variable, x=median))+
  geom_point(mapping = ggplot2::aes(y = variable, size =non_zero, alpha = non_zero, color = non_zero))+
  scale_color_gradient2(high = 'green', mid = "purple", low = "black", midpoint =50, limits=c(0,100))+
  scale_alpha(guide = 'none')+
  scale_size(guide = 'none')+
  geom_point()+
  geom_errorbar(aes(y = variable, xmin = lcl, xmax = ucl), width = 0.2)+
  labs(y="", x = "\nmedian & 95% CI of coefficient (over bootstraps)", color="%")+
  scale_x_continuous(limits=c(-0.4,0.4), breaks=c(-.4,-.3,-.2, -.1, 0, .1, .2, .3, .4))+
  scale_y_discrete(labels= c("child sex (female)", "birth weight", "birth length", "head circumference", "delivery mode (aided)", "induced labor (yes)", "parity (birth before)", "maternal age", "maternal BMI", "maternal hypertension (yes)", "maternal diabetes (yes)", "maternal mental disorders (yes)", "maternal smoking (yes)", "maternal alcohol use (yes)"))+
  geom_vline(xintercept=0, linetype="dashed")+
  theme_bw()+
  ggtitle("nzero = 7")+
  theme(text = element_text(size = 17), axis.title.x= element_text(size=15), axis.title.y= element_text(size=15), plot.title = element_text(size=15), axis.text.y=element_blank())

g1 <- ggplotGrob(p1)
g2 <- ggplotGrob(p2)
g <- cbind(g1, g2, size = "last")
g$heights <- unit.pmax(g1$heights, g2$heights)

png(filename="Results/Figures/elasticNet_singleTissues/Outcome_add/alcohol/Model_coef_Cord.png", width=5800, height=1600, res=400)
grid.draw(g)
dev.off()

get the beta values

```r
### Code for only including \significant variables\ in the beta vector, based on VIP (>75% not-zero in bootstraps)

# get median beta values of the 1000 bootstraps for the model with 7 non-zero coefficients
Beta_hat_s_cord_wa <- matrix(miscTools::colMedians(pm2_Cord_ITU_wa[nzero == nzero_final_cord_wa, .SD, .SDcols = c(\(Intercept)\,sig_var_names_Cord_ITU_wa_finalnzero)]), ncol = 1)
# intenept and variable beta values
# NOTE that median is used here
rownames(Beta_hat_s_cord_wa) <- c(\Intercept\, sig_var_names_Cord_ITU_wa_finalnzero)

Beta_Cord_ITU_wa <- Beta_hat_s_cord_wa

<!-- rnb-source-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->



<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxuc2F2ZShCZXRhX0NvcmRfSVRVX3dhLCBmaWxlPVxcSW5wdXREYXRhL0RhdGFfRWxhc3RpY05ldHMvQmV0YV9Db3JkX0lUVV93YS5SZGF0YVxcKVxuYGBgXG5gYGAifQ== -->

```r
```r
save(Beta_Cord_ITU_wa, file=\InputData/Data_ElasticNets/Beta_Cord_ITU_wa.Rdata\)

<!-- rnb-source-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->


[to the top](#top)


## CVS elastic net {#elasticnetCVSITU}  
main model, without alcohol variable



<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxuIyBpbiBjYXNlIHlvdSB3YW50IHRvIHN0YXJ0IGZyb20gaGVyZVxubG9hZChcXElucHV0RGF0YS9DbG9ja0NhbGN1bGF0aW9uc0lucHV0L1JlZ19JbnB1dF9EYXRhX0NWU19JVFVfRUFBUl9uX25vTmEuUmRhdGFcXClcbmBgYFxuYGBgIn0= -->

```r
```r
# in case you want to start from here
load(\InputData/ClockCalculationsInput/Reg_Input_Data_CVS_ITU_EAAR_n_noNa.Rdata\)

<!-- rnb-source-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->




<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxueXJjX21hdF9JVFVfQ1ZTX24gPC0gbWF0cml4KFJlZ19JbnB1dF9EYXRhX0NWU19JVFVfRUFBUl9uX25vTmEkRUFBUl9MZWUpXG54cmNfbWF0X0lUVV9DVlNfbiA8LSBtb2RlbC5tYXRyaXgoIH4gLiAtIEVBQVJfTGVlLCBkYXRhID0gUmVnX0lucHV0X0RhdGFfQ1ZTX0lUVV9FQUFSX25fbm9OYSlbLCAtMV1cbnlyY19tYXRfSVRVX3NjYWxlZF9DVlNfbiA8LSBzY2FsZSh5cmNfbWF0X0lUVV9DVlNfbilcbnhyY19tYXRfSVRVX3NjYWxlZF9DVlNfbiA8LSBzY2FsZSh4cmNfbWF0X0lUVV9DVlNfbilcbmBgYFxuYGBgIn0= -->

```r
```r
yrc_mat_ITU_CVS_n <- matrix(Reg_Input_Data_CVS_ITU_EAAR_n_noNa$EAAR_Lee)
xrc_mat_ITU_CVS_n <- model.matrix( ~ . - EAAR_Lee, data = Reg_Input_Data_CVS_ITU_EAAR_n_noNa)[, -1]
yrc_mat_ITU_scaled_CVS_n <- scale(yrc_mat_ITU_CVS_n)
xrc_mat_ITU_scaled_CVS_n <- scale(xrc_mat_ITU_CVS_n)

<!-- rnb-source-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->



<!-- set seed -->

<!-- ```{r} -->
<!-- set.seed(2020) -->
<!-- ``` -->


<!-- ```{r, warning=FALSE} -->
<!-- nboot = 1000 -->

<!-- bootstraps_CVS_ITU_n <- replicate(nboot,{ -->
<!--   rws <- sample(1:nrow(xrc_mat_ITU_scaled_CVS_n), replace = TRUE); -->
<!--   ensr(xrc_mat_ITU_scaled_CVS_n[rws, ], yrc_mat_ITU_scaled_CVS_n[rws, ], standardized = FALSE, family="gaussian", nlambda=100,nfolds=10,alpha=c(0.0,0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1.0))}, simplify = FALSE) -->

<!-- ``` -->


<!-- ```{r} -->
<!-- # save bootstrap object -->
<!-- save(bootstraps_CVS_ITU_n, file="InputData/Data_ElasticNets/bootstraps_CVS_ITU_n_1000.Rdata") -->
<!-- ``` -->



<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxubG9hZChcXElucHV0RGF0YS9EYXRhX0VsYXN0aWNOZXRzL2Jvb3RzdHJhcHNfQ1ZTX0lUVV9uXzEwMDAuUmRhdGFcXClcbmBgYFxuYGBgIn0= -->

```r
```r
load(\InputData/Data_ElasticNets/bootstraps_CVS_ITU_n_1000.Rdata\)

<!-- rnb-source-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->




<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuc3VtbWFyaWVzX0NWU19JVFVfbiA8LVxuICBib290c3RyYXBzX0NWU19JVFVfbiAlPiVcbiAgbGFwcGx5KHN1bW1hcnkpICU+JVxuICByYmluZGxpc3QoaWRjb2wgPSBcImJvb3RzdHJhcFwiKVxuXG5zdW1tYXJpZXNfQ1ZTX0lUVV9uXG5gYGAifQ== -->

```r
summaries_CVS_ITU_n <-
  bootstraps_CVS_ITU_n %>%
  lapply(summary) %>%
  rbindlist(idcol = "bootstrap")

summaries_CVS_ITU_n
summaries_CVS_ITU_n[, .SD[cvm == min(cvm)], by = c("bootstrap", "nzero")] %>%
  ggplot2::ggplot(data = .) +
  ggplot2::aes(x = nzero, y = cvm, group = bootstrap) +
  ggplot2::geom_point() +
  ggplot2::geom_line()
png(filename="Results/Figures/elasticNet_singleTissues/Outcome_main/bootstraps_CVS.png", width=800, height=600)
summaries_CVS_ITU_n[, .SD[cvm == min(cvm)], by = c("bootstrap", "nzero")] %>%
  ggplot2::ggplot(data = .) +
  ggplot2::aes(x = nzero, y = cvm, group = bootstrap) +
  ggplot2::geom_point() +
  ggplot2::geom_line()
dev.off()
```r
load(\InputData/Data_ElasticNets/pm2_CVS_ITU_n.Rdata\)

<!-- rnb-source-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->




<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuY3N1bW1hcnlfQ1ZTX0lUVV9uIDwtIFJlZHVjZShmdW5jdGlvbih4LHkpIG1lcmdlKHggPSB4LCB5ID0geSwgYnkgPSBcIm56ZXJvXCIpLCBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3QocG0yX0NWU19JVFVfblssIGxhcHBseSguU0QsIGZ1bmN0aW9uKHgpIHttZWFuKHggIT0gMCl9KSwgLlNEY29scyA9IGMoXCJHZXN0YXRpb25hbF9BZ2VfV2Vla3NcIiwgXCJDaGlsZF9TZXhmZW1hbGVcIiwgXCJDaGlsZF9CaXJ0aF9XZWlnaHRcIiwgXCJDaGlsZF9CaXJ0aF9MZW5ndGhcIiwgXCJDaGlsZF9IZWFkX0NpcmN1bWZlcmVuY2VfQXRfQmlydGhcIiwgXCJEZWxpdmVyeV9tb2RlX2RpY2hvdG9tYWlkZWRcIiwgXCJJbmR1Y2VkX0xhYm91cnllc1wiLCBcIlBhcml0eV9kaWNob3RvbWdpdmVuIGJpcnRoIGJlZm9yZVwiLCBcIk1hdGVybmFsX0FnZV9ZZWFyc1wiLCBcIk1hdGVybmFsX0JvZHlfTWFzc19JbmRleF9pbl9FYXJseV9QcmVnbmFuY3lcIiwgXCJNYXRlcm5hbF9IeXBlcnRlbnNpb25fZGljaG90b21oeXBlcnRlbnNpb24gaW4gY3VycmVudCBwcmVnbmFuY3lcIiwgXCJNYXRlcm5hbF9EaWFiZXRlc19kaWNob3RvbWRpYWJldGVzIGluIGN1cnJlbnQgcHJlZ25hbmN5XCIsIFwiTWF0ZXJuYWxfTWVudGFsX0Rpc29yZGVyc1llc1wiLCBcInNtb2tpbmdfZGljaG90b215ZXNcIiksIGJ5ID0gbnplcm9dXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG0yX0NWU19JVFVfblssIC4obWVhbl9jdm0gPSBtZWFuKGN2bSkpLCBieSA9IG56ZXJvXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG0yX0NWU19JVFVfblssIC4obWVkaWFuX2N2bSA9IG1lZGlhbihjdm0pKSwgYnkgPSBuemVyb11cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkpW29yZGVyKG56ZXJvKV1cblxuY3N1bW1hcnlfQ1ZTX0lUVV9uXG5gYGAifQ== -->

```r
csummary_CVS_ITU_n <- Reduce(function(x,y) merge(x = x, y = y, by = "nzero"), 
                              list(pm2_CVS_ITU_n[, lapply(.SD, function(x) {mean(x != 0)}), .SDcols = c("Gestational_Age_Weeks", "Child_Sexfemale", "Child_Birth_Weight", "Child_Birth_Length", "Child_Head_Circumference_At_Birth", "Delivery_mode_dichotomaided", "Induced_Labouryes", "Parity_dichotomgiven birth before", "Maternal_Age_Years", "Maternal_Body_Mass_Index_in_Early_Pregnancy", "Maternal_Hypertension_dichotomhypertension in current pregnancy", "Maternal_Diabetes_dichotomdiabetes in current pregnancy", "Maternal_Mental_DisordersYes", "smoking_dichotomyes"), by = nzero]
                                   ,
                                   pm2_CVS_ITU_n[, .(mean_cvm = mean(cvm)), by = nzero],
                                   pm2_CVS_ITU_n[, .(median_cvm = median(cvm)), by = nzero]
                              ))[order(nzero)]

csummary_CVS_ITU_n
g1_CVS_ITU_n <-
  csummary_CVS_ITU_n %>%
  melt(id.vars = c("nzero", "mean_cvm", "median_cvm")) %>%
  ggplot2::ggplot(.) +
  ggplot2::theme_bw() +
  ggplot2::aes(x = nzero) +
  ggplot2::geom_point(mapping = ggplot2::aes(y = variable, size = value, alpha = value, color = value*100)) +
  ggplot2::scale_color_gradient2(high = 'green', mid = "purple", low = "black", midpoint =50)+
  ggplot2::scale_alpha(guide = 'none')+
  ggplot2::scale_size(guide = 'none')+
  ggplot2::scale_y_discrete(labels= c("gestage at birth", "child sex (female)", "birth weight", "birth length", "head circumference", "delivery mode (aided)", "induced labor (yes)", "parity (birth before)", "maternal age", "maternal BMI", "maternal hypertension (yes)", "maternal diabetes (yes)", "maternal mental disorders (yes)", "maternal smoking (yes)"))+
  ggplot2::scale_x_continuous(breaks=0:14, labels=)+
  ggplot2::labs(y="predictor", x = "number of non-zero coefficients", color="%")+
  ggplot2::theme(text = element_text(size = 15), axis.title.x= element_text(size=15), axis.title.y= element_text(size=15))

g2_CVS_ITU_n <-
  csummary_CVS_ITU_n %>%
  ggplot2::ggplot(.) +
  ggplot2::theme_bw() +
  ggplot2::aes(x = nzero, y = median_cvm) +
  ggplot2::geom_point() + ggplot2::geom_line()+
  ggplot2::labs(y="median cvm", x = "number of non-zero coefficients")+
  ggplot2::scale_x_continuous(breaks=0:14, labels=)+
  ggplot2::theme(axis.text=element_text(size=15),axis.title=element_text(size=18))


gridExtra::grid.arrange(g1_CVS_ITU_n, g2_CVS_ITU_n, ncol = 1)

# note: not a big difference if mean/median cvm is used
png(filename="Results/Figures/elasticNet_singleTissues/Outcome_main/bootstrapModels_CVS.png", width=2400, height=1800, res=300)
gridExtra::grid.arrange(g1_CVS_ITU_n, g2_CVS_ITU_n, ncol = 1)
dev.off()
png(filename="Results/Figures/elasticNet_singleTissues/Outcome_main/Model_CVS.png", width=2800, height=1400, res=400)
g1_CVS_ITU_n
dev.off()
elbow_finder(csummary_CVS_ITU_n$nzero[-1], csummary_CVS_ITU_n$median_cvm[-1])
nzero_indices_CVS <- data.frame(t(elbow_finder(csummary_CVS_ITU_n$nzero[-1], csummary_CVS_ITU_n$median_cvm[-1])))
colnames(nzero_indices_CVS) <- c("x", "y")
rownames(nzero_indices_CVS) <- NULL
```r
nzero_final_CVS <- 8

<!-- rnb-source-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->



<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxubm9uemVyb19jaG9vc2VfQ1ZTIDwtIGdncGxvdDI6OmdncGxvdChjc3VtbWFyeV9DVlNfSVRVX24pICtcbiAgZ2dwbG90Mjo6dGhlbWVfYncoKStcbiAgZ2dwbG90Mjo6YWVzKHggPSBuemVybywgeSA9IG1lZGlhbl9jdm0pICtcbiAgZ2dwbG90Mjo6c2NhbGVfeF9jb250aW51b3VzKGJyZWFrcz1jKDA6MTcpKStcbiAgZ2dwbG90Mjo6Z2VvbV9wb2ludCgpICsgZ2dwbG90Mjo6Z2VvbV9saW5lKCkrXG4gIGdncGxvdDI6Omdlb21fcG9pbnQoZGF0YT1uemVyb19pbmRpY2VzX0NWUywgYWVzKHg9eCwgeT15KSwgY29sb3VyPVwicmVkXCIsIHNpemU9MikrXG4gIGdncGxvdDI6OnlsYWIoXCJtZWRpYW4gb2YgbWluaW11bSBjcm9zcy12YWxpZGF0aW9uIGVycm9ycyBvdmVyIGJvb3RzdHJhcHNcIikrXG4gIGdncGxvdDI6OnhsYWIoXCJudW1iZXIgb2Ygbm9uLXplcm8gY29lZmZpY2llbnRzXCIpK1xuICBnZ3Bsb3QyOjpnZW9tX3NlZ21lbnQoYWVzKHggPSBuemVyb1sxXSwgeSA9IG1lZGlhbl9jdm1bMV0sIHhlbmQgPSBuemVyb1sxNV0sIHllbmQgPSBtZWRpYW5fY3ZtWzE1XSwgY29sb3VyID0gXCJzZWdtZW50XCIpLCBkYXRhID0gY3N1bW1hcnlfQ1ZTX0lUVV9uLCBzaG93LmxlZ2VuZCA9IEYpXG5cbm5vbnplcm9fY2hvb3NlX0NWU1xuYGBgIn0= -->

```r
nonzero_choose_CVS <- ggplot2::ggplot(csummary_CVS_ITU_n) +
  ggplot2::theme_bw()+
  ggplot2::aes(x = nzero, y = median_cvm) +
  ggplot2::scale_x_continuous(breaks=c(0:17))+
  ggplot2::geom_point() + ggplot2::geom_line()+
  ggplot2::geom_point(data=nzero_indices_CVS, aes(x=x, y=y), colour="red", size=2)+
  ggplot2::ylab("median of minimum cross-validation errors over bootstraps")+
  ggplot2::xlab("number of non-zero coefficients")+
  ggplot2::geom_segment(aes(x = nzero[1], y = median_cvm[1], xend = nzero[15], yend = median_cvm[15], colour = "segment"), data = csummary_CVS_ITU_n, show.legend = F)

nonzero_choose_CVS
png(filename="Results/Figures/elasticNet_singleTissues/Outcome_main/nzero_choose_CVS.png", width=1600, height=1400, res=300)
nonzero_choose_CVS
dev.off()
```r
summary_CVS_ITU_n_finalnzero <- csummary_CVS_ITU_n[nzero %in% nzero_final_CVS]
sig_var_names_CVS_ITU_n_finalnzero <- Filter(function(x) any(x > 0.75), summary_CVS_ITU_n_finalnzero[,!c(\nzero\, \mean_cvm\, \median_cvm\)]) %>% colnames()
colnames(summary_CVS_ITU_n_finalnzero) <- c(\non-zero\, \gestage at birth\, \child sex (female)\, \birth weight\, \birth length\, \head circumference\, \delivery mode (aided)\, \induced labor (yes)\, \parity (birth before)\, \maternal age\, \maternal BMI\, \maternal hypertension (yes)\, \maternal diabetes (yes)\, \maternal mental disorders (yes)\, \maternal smoking (yes)\, \mean cvm\, \median cvm\)
summary_CVS_ITU_n_finalnzeroT <- as.data.frame(t(summary_CVS_ITU_n_finalnzero[,-c(\non-zero\, \median cvm\, \mean cvm\)]))
summary_CVS_ITU_n_finalnzeroT$variable <- rownames(summary_CVS_ITU_n_finalnzeroT)
rownames(summary_CVS_ITU_n_finalnzeroT) <- NULL
names(summary_CVS_ITU_n_finalnzeroT)[names(summary_CVS_ITU_n_finalnzeroT) == 'V1'] <- 'percent'
summary_CVS_ITU_n_finalnzeroT <- summary_CVS_ITU_n_finalnzeroT[order(summary_CVS_ITU_n_finalnzeroT$percent),]

summary_CVS_ITU_n_finalnzeroT$number <- seq(1, length(summary_CVS_ITU_n_finalnzeroT$variable))

<!-- rnb-source-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->




<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxucGVyY192YXJzX0NWU19JVFVfbiA8LSBcbmdncGxvdChzdW1tYXJ5X0NWU19JVFVfbl9maW5hbG56ZXJvVCwgYWVzKHJlb3JkZXIodmFyaWFibGUsIHBlcmNlbnQpLCBwZXJjZW50LCBncm91cD0xKSkrXG5nZW9tX3BvaW50KCkrIGdlb21fbGluZSgpK1xueWxhYihcIiUgb2NjdXJlbmNlIGluIG1vZGVscyB3aXRoIG56ZXJvIGNvZWZmaWNpZW50cyA9IDlcIikrXG5zY2FsZV95X2NvbnRpbnVvdXMoYnJlYWtzPWMoMC4xLDAuMiwwLjMsMC40LDAuNSwwLjYsMC43LDAuOCwwLjkpKStcbnhsYWIoXCJ2YXJpYWJsZVwiKStcbmNvb3JkX2ZsaXAoKStcbmdlb21faGxpbmUoeWludGVyY2VwdD0wLjc1LCBsaW5ldHlwZT1cImRvdHRlZFwiKStcbnRoZW1lX2J3KClcblxucGVyY192YXJzX0NWU19JVFVfblxuXG4jIGRlY2lkZSBmb3IgY3V0LW9mZiAlIC0+IGhlcmUgLjc1XG5cbkZpbHRlcihmdW5jdGlvbih4KSBhbnkoeCA+IDAuNzUpLCBzdW1tYXJ5X0NWU19JVFVfbl9maW5hbG56ZXJvWywhYyhcIm5vbi16ZXJvXCIsIFwibWVhbiBjdm1cIiwgXCJtZWRpYW4gY3ZtXCIpXSlcblxuYGBgIn0= -->

```r
perc_vars_CVS_ITU_n <- 
ggplot(summary_CVS_ITU_n_finalnzeroT, aes(reorder(variable, percent), percent, group=1))+
geom_point()+ geom_line()+
ylab("% occurence in models with nzero coefficients = 9")+
scale_y_continuous(breaks=c(0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9))+
xlab("variable")+
coord_flip()+
geom_hline(yintercept=0.75, linetype="dotted")+
theme_bw()

perc_vars_CVS_ITU_n

# decide for cut-off % -> here .75

Filter(function(x) any(x > 0.75), summary_CVS_ITU_n_finalnzero[,!c("non-zero", "mean cvm", "median cvm")])
png(filename="Results/Figures/elasticNet_singleTissues/Outcome_main/varsPercent_CVS.png", width=1800, height=1400, res=300)
perc_vars_CVS_ITU_n
dev.off()
```r
pm2_CVS_ITU_n_coef <-
dcast(pm2_CVS_ITU_n[,
as.list(unlist(
lapply(.SD,
function(x) {
y <- unname(quantile(x[x != 0], probs = c(0.025, 0.975)))
list(\non_zero\ = 100 * mean(x != 0),
lcl = y[1],
ucl = y[2],
width = diff(y),
median = median(x[x!= 0]))
}))),
.SDcols = c(\Gestational_Age_Weeks\, \Child_Sexfemale\, \Child_Birth_Weight\, \Child_Birth_Length\, \Child_Head_Circumference_At_Birth\, \Delivery_mode_dichotomaided\, \Induced_Labouryes\, \Parity_dichotomgiven birth before\, \Maternal_Age_Years\, \Maternal_Body_Mass_Index_in_Early_Pregnancy\, \Maternal_Hypertension_dichotomhypertension in current pregnancy\, \Maternal_Diabetes_dichotomdiabetes in current pregnancy\, \Maternal_Mental_DisordersYes\, \smoking_dichotomyes\),
by = nzero][order(nzero)] %>%
melt(id.var = \nzero\) %>%
.[, metric := sub(\^.+\\.(.+)$\, \\\1\, variable)] %>%
.[, variable := sub(\^(.+)\\..+$\, \\\1\, variable)] %>%
.[nzero ==nzero_final_CVS], nzero+ variable ~ metric, value.var=\value\)

# get desired order of predictors
pm2_CVS_ITU_n_coef <-
pm2_CVS_ITU_n_coef[match(c(\Gestational_Age_Weeks\, \Child_Sexfemale\, \Child_Birth_Weight\, \Child_Birth_Length\, \Child_Head_Circumference_At_Birth\, \Delivery_mode_dichotomaided\, \Induced_Labouryes\, \Parity_dichotomgiven birth before\, \Maternal_Age_Years\, \Maternal_Body_Mass_Index_in_Early_Pregnancy\, \Maternal_Hypertension_dichotomhypertension in current pregnancy\, \Maternal_Diabetes_dichotomdiabetes in current pregnancy\, \Maternal_Mental_DisordersYes\, \smoking_dichotomyes\), pm2_CVS_ITU_n_coef$variable),]
pm2_CVS_ITU_n_coef$variable <- factor(pm2_CVS_ITU_n_coef$variabl, levels=unique(pm2_CVS_ITU_n_coef$variable))

<!-- rnb-source-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->



<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxud3JpdGVfeGxzeChwbTJfQ1ZTX0lUVV9uX2NvZWYsXFxSZXN1bHRzL1RhYmxlcy9Db2VmZmljaWVudHNNb2RlbF9DVlMueGxzeFxcKVxuYGBgXG5gYGAifQ== -->

```r
```r
write_xlsx(pm2_CVS_ITU_n_coef,\Results/Tables/CoefficientsModel_CVS.xlsx\)

<!-- rnb-source-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->



<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxuc2lnX3ZhcnNfQ1ZTX0lUVV9uIDwtXG5wbTJfQ1ZTX0lUVV9uX2NvZWYgJT4lXG4gIGdncGxvdDI6OmdncGxvdCguKSArXG4gIGdncGxvdDI6OnRoZW1lX2J3KCkgK1xuICBnZ3Bsb3QyOjp0aGVtZShheGlzLnRleHQueD1lbGVtZW50X2JsYW5rKCkpK1xuICBnZ3Bsb3QyOjphZXMoeD1cXG56ZXJvXFwpK1xuICBnZ3Bsb3QyOjpnZW9tX3BvaW50KG1hcHBpbmcgPSBnZ3Bsb3QyOjphZXMoeSA9IHZhcmlhYmxlLCBzaXplID1ub25femVybywgYWxwaGEgPSBub25femVybywgY29sb3IgPSBub25femVybykpICtcbiAgZ2dwbG90Mjo6Z2VvbV90ZXh0KGFlcyh5PXZhcmlhYmxlLCBsYWJlbD1zcHJpbnRmKFxcJTAuMmZcXCwgcm91bmQobWVkaWFuLCBkaWdpdHM9MikpLCBzaXplPTUwKSxoanVzdD0wLCB2anVzdD0wLjUsIG51ZGdlX3ggPSAwLjEpK1xuICBnZ3Bsb3QyOjpzY2FsZV9jb2xvcl9ncmFkaWVudDIoaGlnaCA9ICdncmVlbicsIG1pZCA9IFxccHVycGxlXFwsIGxvdyA9IFxcYmxhY2tcXCwgbWlkcG9pbnQgPTUwKStcbiAgZ2dwbG90Mjo6c2NhbGVfYWxwaGEoZ3VpZGUgPSAnbm9uZScpK1xuICBnZ3Bsb3QyOjpzY2FsZV9zaXplKGd1aWRlID0gJ25vbmUnKStcbiAgZ2dwbG90Mjo6c2NhbGVfeV9kaXNjcmV0ZShsYWJlbHM9IGMoXFxnZXN0YWdlIGF0IGJpcnRoXFwsIFxcY2hpbGQgc2V4IChmZW1hbGUpXFwsIFxcYmlydGggd2VpZ2h0XFwsIFxcYmlydGggbGVuZ3RoXFwsIFxcaGVhZCBjaXJjdW1mZXJlbmNlXFwsIFxcZGVsaXZlcnkgbW9kZSAoYWlkZWQpXFwsIFxcaW5kdWNlZCBsYWJvciAoeWVzKVxcLCBcXHBhcml0eSAoYmlydGggYmVmb3JlKVxcLCBcXG1hdGVybmFsIGFnZVxcLCBcXG1hdGVybmFsIEJNSVxcLCBcXG1hdGVybmFsIGh5cGVydGVuc2lvbiAoeWVzKVxcLCBcXG1hdGVybmFsIGRpYWJldGVzICh5ZXMpXFwsIFxcbWF0ZXJuYWwgbWVudGFsIGRpc29yZGVycyAoeWVzKVxcLCBcXG1hdGVybmFsIHNtb2tpbmcgKHllcylcXCkpK1xuICBnZ3Bsb3QyOjpsYWJzKHk9XFxwcmVkaWN0b3JcXCwgeCA9IFxcbnVtYmVyIG9mIG5vbi16ZXJvIGNvZWZmaWNpZW50cyA9IDlcXCwgY29sb3I9XFwlXFwpXG5cbmBgYFxuYGBgIn0= -->

```r
```r
sig_vars_CVS_ITU_n <-
pm2_CVS_ITU_n_coef %>%
  ggplot2::ggplot(.) +
  ggplot2::theme_bw() +
  ggplot2::theme(axis.text.x=element_blank())+
  ggplot2::aes(x=\nzero\)+
  ggplot2::geom_point(mapping = ggplot2::aes(y = variable, size =non_zero, alpha = non_zero, color = non_zero)) +
  ggplot2::geom_text(aes(y=variable, label=sprintf(\%0.2f\, round(median, digits=2)), size=50),hjust=0, vjust=0.5, nudge_x = 0.1)+
  ggplot2::scale_color_gradient2(high = 'green', mid = \purple\, low = \black\, midpoint =50)+
  ggplot2::scale_alpha(guide = 'none')+
  ggplot2::scale_size(guide = 'none')+
  ggplot2::scale_y_discrete(labels= c(\gestage at birth\, \child sex (female)\, \birth weight\, \birth length\, \head circumference\, \delivery mode (aided)\, \induced labor (yes)\, \parity (birth before)\, \maternal age\, \maternal BMI\, \maternal hypertension (yes)\, \maternal diabetes (yes)\, \maternal mental disorders (yes)\, \maternal smoking (yes)\))+
  ggplot2::labs(y=\predictor\, x = \number of non-zero coefficients = 9\, color=\%\)

<!-- rnb-source-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->



<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuY29lZl9DVlNfSVRVX24gPC0gXG5nZ3Bsb3QocG0yX0NWU19JVFVfbl9jb2VmLCBhZXMoeSA9IHZhcmlhYmxlLCB4PW1lZGlhbikpK1xuZ2VvbV9wb2ludChtYXBwaW5nID0gZ2dwbG90Mjo6YWVzKHkgPSB2YXJpYWJsZSwgc2l6ZSA9bm9uX3plcm8sIGFscGhhID0gbm9uX3plcm8sIGNvbG9yID0gbm9uX3plcm8pKStcbnNjYWxlX2NvbG9yX2dyYWRpZW50MihoaWdoID0gJ2dyZWVuJywgbWlkID0gXCJwdXJwbGVcIiwgbG93ID0gXCJibGFja1wiLCBtaWRwb2ludCA9NTAsIGxpbWl0cz1jKDAsMTAwKSkrXG5zY2FsZV9hbHBoYShndWlkZSA9ICdub25lJykrXG5zY2FsZV9zaXplKGd1aWRlID0gJ25vbmUnKStcbmdlb21fcG9pbnQoKStcbmdlb21fZXJyb3JiYXIoYWVzKHkgPSB2YXJpYWJsZSwgeG1pbiA9IGxjbCwgeG1heCA9IHVjbCksIHdpZHRoID0gMC4yKStcbmxhYnMoeT1cInByZWRpY3RvclwiLCB4ID0gXCJcXG5tZWRpYW4gJiA5NSUgQ0kgb2YgY29lZmZpY2llbnQgKG92ZXIgYm9vdHN0cmFwcylcIiwgY29sb3I9XCIlXCIpK1xuc2NhbGVfeF9jb250aW51b3VzKGxpbWl0cz1jKC0wLjQsMC40KSwgYnJlYWtzPWMoLS40LC0uMywtLjIsIC0uMSwgMCwgLjEsIC4yLCAuMywgLjQpKStcbnNjYWxlX3lfZGlzY3JldGUobGFiZWxzPSBjKFwiZ2VzdGFnZSBhdCBiaXJ0aFwiLCBcImNoaWxkIHNleCAoZmVtYWxlKVwiLCBcImJpcnRoIHdlaWdodFwiLCBcImJpcnRoIGxlbmd0aFwiLCBcImhlYWQgY2lyY3VtZmVyZW5jZVwiLCBcImRlbGl2ZXJ5IG1vZGUgKGFpZGVkKVwiLCBcImluZHVjZWQgbGFib3IgKHllcylcIiwgXCJwYXJpdHkgKGJpcnRoIGJlZm9yZSlcIiwgXCJtYXRlcm5hbCBhZ2VcIiwgXCJtYXRlcm5hbCBCTUlcIiwgXCJtYXRlcm5hbCBoeXBlcnRlbnNpb24gKHllcylcIiwgXCJtYXRlcm5hbCBkaWFiZXRlcyAoeWVzKVwiLCBcIm1hdGVybmFsIG1lbnRhbCBkaXNvcmRlcnMgKHllcylcIiwgXCJtYXRlcm5hbCBzbW9raW5nICh5ZXMpXCIpKStcbmdlb21fdmxpbmUoeGludGVyY2VwdD0wLCBsaW5ldHlwZT1cImRhc2hlZFwiKStcbnRoZW1lX2J3KCkrXG50aGVtZSh0ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNSksIGF4aXMudGl0bGUueD0gZWxlbWVudF90ZXh0KHNpemU9MTUpLCBheGlzLnRpdGxlLnk9IGVsZW1lbnRfdGV4dChzaXplPTE1KSlcblxuXG5jb2VmX0NWU19JVFVfbiBcbmBgYCJ9 -->

```r
coef_CVS_ITU_n <- 
ggplot(pm2_CVS_ITU_n_coef, aes(y = variable, x=median))+
geom_point(mapping = ggplot2::aes(y = variable, size =non_zero, alpha = non_zero, color = non_zero))+
scale_color_gradient2(high = 'green', mid = "purple", low = "black", midpoint =50, limits=c(0,100))+
scale_alpha(guide = 'none')+
scale_size(guide = 'none')+
geom_point()+
geom_errorbar(aes(y = variable, xmin = lcl, xmax = ucl), width = 0.2)+
labs(y="predictor", x = "\nmedian & 95% CI of coefficient (over bootstraps)", color="%")+
scale_x_continuous(limits=c(-0.4,0.4), breaks=c(-.4,-.3,-.2, -.1, 0, .1, .2, .3, .4))+
scale_y_discrete(labels= c("gestage at birth", "child sex (female)", "birth weight", "birth length", "head circumference", "delivery mode (aided)", "induced labor (yes)", "parity (birth before)", "maternal age", "maternal BMI", "maternal hypertension (yes)", "maternal diabetes (yes)", "maternal mental disorders (yes)", "maternal smoking (yes)"))+
geom_vline(xintercept=0, linetype="dashed")+
theme_bw()+
theme(text = element_text(size = 15), axis.title.x= element_text(size=15), axis.title.y= element_text(size=15))


coef_CVS_ITU_n 
png(filename="Results/Figures/elasticNet_singleTissues/Outcome_main/coef_CVS.png", width=2800, height=1400, res=400)
coef_CVS_ITU_n 
dev.off()
```r
g1_CVS_ITU_n <-
  csummary_CVS_ITU_n %>%
  melt(id.vars = c(\nzero\, \mean_cvm\, \median_cvm\)) %>%
  ggplot2::ggplot(.) +
  ggplot2::theme_bw() +
  ggplot2::aes(x = nzero) +
  ggplot2::geom_point(mapping = ggplot2::aes(y = variable, size = value, alpha = value, color = value*100)) +
  ggplot2::scale_color_gradient2(high = 'green', mid = \purple\, low = \black\, midpoint =50)+
  ggplot2::scale_alpha(guide = 'none')+
  ggplot2::scale_size(guide = 'none')+
  ggplot2::scale_y_discrete(labels= c(\gestage at birth\, \child sex (female)\, \birth weight\, \birth length\, \head circumference\, \delivery mode (aided)\, \induced labor (yes)\, \parity (birth before)\, \maternal age\, \maternal BMI\, \maternal hypertension (yes)\, \maternal diabetes (yes)\, \maternal mental disorders (yes)\, \maternal smoking (yes)\))+
  ggplot2::scale_x_continuous(breaks=0:14, labels=)+
  ggplot2::labs(y=\predictor\, x = \number of non-zero coefficients\, color=\%\)+
  ggplot2::theme(text = element_text(size = 20), axis.title.x= element_text(size=15), axis.title.y= element_text(size=15), legend.position = \none\)

coef_CVS_ITU_n <- 
ggplot(pm2_CVS_ITU_n_coef, aes(y = variable, x=median))+
geom_point(mapping = ggplot2::aes(y = variable, size =non_zero, alpha = non_zero, color = non_zero))+
scale_color_gradient2(high = 'green', mid = \purple\, low = \black\, midpoint =50, limits=c(0,100))+
scale_alpha(guide = 'none')+
scale_size(guide = 'none')+
geom_point()+
geom_errorbar(aes(y = variable, xmin = lcl, xmax = ucl), width = 0.2)+
labs(y=\\, x = \median & 95% CI of coefficient (over bootstraps)\, color=\%\)+
#ggtitle(\nzero = 8\)+
scale_x_continuous(limits=c(-0.4,0.4), breaks=c(-.4,-.3,-.2, -.1, 0, .1, .2, .3, .4))+
scale_y_discrete(labels= c(\gestage at birth\, \child sex (female)\, \birth weight\, \birth length\, \head circumference\, \delivery mode (aided)\, \induced labor (yes)\, \parity (birth before)\, \maternal age\, \maternal BMI\, \maternal hypertension (yes)\, \maternal diabetes (yes)\, \maternal mental disorders (yes)\, \maternal smoking (yes)\))+
geom_vline(xintercept=0, linetype=\dashed\)+
theme_bw()+
theme(text = element_text(size = 20), axis.title.x= element_text(size=15), axis.title.y= element_text(size=15))
#plot.title = element_text(size=15)

<!-- rnb-source-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->


Plot:

<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxucDEgPC1cbiAgY3N1bW1hcnlfQ1ZTX0lUVV9uICU+JVxuICBtZWx0KGlkLnZhcnMgPSBjKFwibnplcm9cIiwgXCJtZWFuX2N2bVwiLCBcIm1lZGlhbl9jdm1cIikpICU+JVxuICBnZ3Bsb3QyOjpnZ3Bsb3QoLikgK1xuICBnZ3Bsb3QyOjp0aGVtZV9idygpICtcbiAgZ2dwbG90Mjo6YWVzKHggPSBuemVybykgK1xuICBnZ3Bsb3QyOjpnZW9tX3BvaW50KG1hcHBpbmcgPSBnZ3Bsb3QyOjphZXMoeSA9IHZhcmlhYmxlLCBzaXplID0gdmFsdWUsIGFscGhhID0gdmFsdWUsIGNvbG9yID0gdmFsdWUqMTAwKSkgK1xuICBnZ3Bsb3QyOjpzY2FsZV9jb2xvcl9ncmFkaWVudDIoaGlnaCA9ICdncmVlbicsIG1pZCA9IFwicHVycGxlXCIsIGxvdyA9IFwiYmxhY2tcIiwgbWlkcG9pbnQgPTUwKStcbiAgZ2dwbG90Mjo6c2NhbGVfYWxwaGEoZ3VpZGUgPSAnbm9uZScpK1xuICBnZ3Bsb3QyOjpzY2FsZV9zaXplKGd1aWRlID0gJ25vbmUnKStcbiAgZ2dwbG90Mjo6c2NhbGVfeV9kaXNjcmV0ZShsYWJlbHM9IGMoXCJnZXN0YWdlIGF0IGJpcnRoXCIsIFwiY2hpbGQgc2V4IChmZW1hbGUpXCIsIFwiYmlydGggd2VpZ2h0XCIsIFwiYmlydGggbGVuZ3RoXCIsIFwiaGVhZCBjaXJjdW1mZXJlbmNlXCIsIFwiZGVsaXZlcnkgbW9kZSAoYWlkZWQpXCIsIFwiaW5kdWNlZCBsYWJvciAoeWVzKVwiLCBcInBhcml0eSAoYmlydGggYmVmb3JlKVwiLCBcIm1hdGVybmFsIGFnZVwiLCBcIm1hdGVybmFsIEJNSVwiLCBcIm1hdGVybmFsIGh5cGVydGVuc2lvbiAoeWVzKVwiLCBcIm1hdGVybmFsIGRpYWJldGVzICh5ZXMpXCIsIFwibWF0ZXJuYWwgbWVudGFsIGRpc29yZGVycyAoeWVzKVwiLCBcIm1hdGVybmFsIHNtb2tpbmcgKHllcylcIikpK1xuICBnZ3Bsb3QyOjpzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzPTA6MTQsIGxhYmVscz0pK1xuICBnZ3Bsb3QyOjpsYWJzKHk9XCJwcmVkaWN0b3JcIiwgeCA9IFwiXFxubnVtYmVyIG9mIG5vbi16ZXJvIGNvZWZmaWNpZW50c1wiLCBjb2xvcj1cIiVcIikrXG4gIGdncGxvdDI6OnRoZW1lKHRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE3KSwgYXhpcy50aXRsZS54PSBlbGVtZW50X3RleHQoc2l6ZT0xNSksIGF4aXMudGl0bGUueT0gZWxlbWVudF90ZXh0KHNpemU9MTUpLCBsZWdlbmQucG9zaXRpb24gPSBcIm5vbmVcIilcblxucDIgPC0gXG5nZ3Bsb3QocG0yX0NWU19JVFVfbl9jb2VmLCBhZXMoeSA9IHZhcmlhYmxlLCB4PW1lZGlhbikpK1xuZ2VvbV9wb2ludChtYXBwaW5nID0gZ2dwbG90Mjo6YWVzKHkgPSB2YXJpYWJsZSwgc2l6ZSA9bm9uX3plcm8sIGFscGhhID0gbm9uX3plcm8sIGNvbG9yID0gbm9uX3plcm8pKStcbnNjYWxlX2NvbG9yX2dyYWRpZW50MihoaWdoID0gJ2dyZWVuJywgbWlkID0gXCJwdXJwbGVcIiwgbG93ID0gXCJibGFja1wiLCBtaWRwb2ludCA9NTAsIGxpbWl0cz1jKDAsMTAwKSkrXG5zY2FsZV9hbHBoYShndWlkZSA9ICdub25lJykrXG5zY2FsZV9zaXplKGd1aWRlID0gJ25vbmUnKStcbmdlb21fcG9pbnQoKStcbmdlb21fZXJyb3JiYXIoYWVzKHkgPSB2YXJpYWJsZSwgeG1pbiA9IGxjbCwgeG1heCA9IHVjbCksIHdpZHRoID0gMC4yKStcbmxhYnMoeT1cIlwiLCB4ID0gXCJcXG5tZWRpYW4gJiA5NSUgQ0kgb2YgY29lZmZpY2llbnQgKG92ZXIgYm9vdHN0cmFwcylcIiwgY29sb3I9XCIlXCIpK1xuZ2d0aXRsZShcIm56ZXJvID0gOFwiKStcbnNjYWxlX3hfY29udGludW91cyhsaW1pdHM9YygtMC40LDAuNCksIGJyZWFrcz1jKC0uNCwtLjMsLS4yLCAtLjEsIDAsIC4xLCAuMiwgLjMsIC40KSkrXG5zY2FsZV95X2Rpc2NyZXRlKGxhYmVscz0gYyhcImdlc3RhZ2UgYXQgYmlydGhcIiwgXCJjaGlsZCBzZXggKGZlbWFsZSlcIiwgXCJiaXJ0aCB3ZWlnaHRcIiwgXCJiaXJ0aCBsZW5ndGhcIiwgXCJoZWFkIGNpcmN1bWZlcmVuY2VcIiwgXCJkZWxpdmVyeSBtb2RlIChhaWRlZClcIiwgXCJpbmR1Y2VkIGxhYm9yICh5ZXMpXCIsIFwicGFyaXR5IChiaXJ0aCBiZWZvcmUpXCIsIFwibWF0ZXJuYWwgYWdlXCIsIFwibWF0ZXJuYWwgQk1JXCIsIFwibWF0ZXJuYWwgaHlwZXJ0ZW5zaW9uICh5ZXMpXCIsIFwibWF0ZXJuYWwgZGlhYmV0ZXMgKHllcylcIiwgXCJtYXRlcm5hbCBtZW50YWwgZGlzb3JkZXJzICh5ZXMpXCIsIFwibWF0ZXJuYWwgc21va2luZyAoeWVzKVwiKSkrXG5nZW9tX3ZsaW5lKHhpbnRlcmNlcHQ9MCwgbGluZXR5cGU9XCJkYXNoZWRcIikrXG50aGVtZV9idygpK1xudGhlbWUodGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTcpLCBheGlzLnRpdGxlLng9IGVsZW1lbnRfdGV4dChzaXplPTE1KSwgYXhpcy50aXRsZS55PSBlbGVtZW50X3RleHQoc2l6ZT0xNSksIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZT0xNSksIGF4aXMudGV4dC55PWVsZW1lbnRfYmxhbmsoKSlcblxuZzEgPC0gZ2dwbG90R3JvYihwMSlcbmcyIDwtIGdncGxvdEdyb2IocDIpXG5nIDwtIGNiaW5kKGcxLCBnMiwgc2l6ZSA9IFwibGFzdFwiKVxuZyRoZWlnaHRzIDwtIHVuaXQucG1heChnMSRoZWlnaHRzLCBnMiRoZWlnaHRzKVxuXG5wbmcoZmlsZW5hbWU9XCJSZXN1bHRzL0ZpZ3VyZXMvZWxhc3RpY05ldF9zaW5nbGVUaXNzdWVzL091dGNvbWVfbWFpbi9Nb2RlbF9jb2VmX0NWUy5wbmdcIiwgd2lkdGg9NTgwMCwgaGVpZ2h0PTE2MDAsIHJlcz00MDApXG5ncmlkLmRyYXcoZylcbmRldi5vZmYoKVxuYGBgIn0= -->

```r
p1 <-
  csummary_CVS_ITU_n %>%
  melt(id.vars = c("nzero", "mean_cvm", "median_cvm")) %>%
  ggplot2::ggplot(.) +
  ggplot2::theme_bw() +
  ggplot2::aes(x = nzero) +
  ggplot2::geom_point(mapping = ggplot2::aes(y = variable, size = value, alpha = value, color = value*100)) +
  ggplot2::scale_color_gradient2(high = 'green', mid = "purple", low = "black", midpoint =50)+
  ggplot2::scale_alpha(guide = 'none')+
  ggplot2::scale_size(guide = 'none')+
  ggplot2::scale_y_discrete(labels= c("gestage at birth", "child sex (female)", "birth weight", "birth length", "head circumference", "delivery mode (aided)", "induced labor (yes)", "parity (birth before)", "maternal age", "maternal BMI", "maternal hypertension (yes)", "maternal diabetes (yes)", "maternal mental disorders (yes)", "maternal smoking (yes)"))+
  ggplot2::scale_x_continuous(breaks=0:14, labels=)+
  ggplot2::labs(y="predictor", x = "\nnumber of non-zero coefficients", color="%")+
  ggplot2::theme(text = element_text(size = 17), axis.title.x= element_text(size=15), axis.title.y= element_text(size=15), legend.position = "none")

p2 <- 
ggplot(pm2_CVS_ITU_n_coef, aes(y = variable, x=median))+
geom_point(mapping = ggplot2::aes(y = variable, size =non_zero, alpha = non_zero, color = non_zero))+
scale_color_gradient2(high = 'green', mid = "purple", low = "black", midpoint =50, limits=c(0,100))+
scale_alpha(guide = 'none')+
scale_size(guide = 'none')+
geom_point()+
geom_errorbar(aes(y = variable, xmin = lcl, xmax = ucl), width = 0.2)+
labs(y="", x = "\nmedian & 95% CI of coefficient (over bootstraps)", color="%")+
ggtitle("nzero = 8")+
scale_x_continuous(limits=c(-0.4,0.4), breaks=c(-.4,-.3,-.2, -.1, 0, .1, .2, .3, .4))+
scale_y_discrete(labels= c("gestage at birth", "child sex (female)", "birth weight", "birth length", "head circumference", "delivery mode (aided)", "induced labor (yes)", "parity (birth before)", "maternal age", "maternal BMI", "maternal hypertension (yes)", "maternal diabetes (yes)", "maternal mental disorders (yes)", "maternal smoking (yes)"))+
geom_vline(xintercept=0, linetype="dashed")+
theme_bw()+
theme(text = element_text(size = 17), axis.title.x= element_text(size=15), axis.title.y= element_text(size=15), plot.title = element_text(size=15), axis.text.y=element_blank())

g1 <- ggplotGrob(p1)
g2 <- ggplotGrob(p2)
g <- cbind(g1, g2, size = "last")
g$heights <- unit.pmax(g1$heights, g2$heights)

png(filename="Results/Figures/elasticNet_singleTissues/Outcome_main/Model_coef_CVS.png", width=5800, height=1600, res=400)
grid.draw(g)
dev.off()

to the top

CVS elastic net

additional model, with alcohol variable

```r
# in case you want to start from here
load(\InputData/ClockCalculationsInput/Reg_Input_Data_CVS_ITU_EAAR_wa_noNa.Rdata\)

<!-- rnb-source-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->




<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxueXJjX21hdF9JVFVfQ1ZTX3dhIDwtIG1hdHJpeChSZWdfSW5wdXRfRGF0YV9DVlNfSVRVX0VBQVJfd2Ffbm9OYSRFQUFSX0xlZSlcbnhyY19tYXRfSVRVX0NWU193YSA8LSBtb2RlbC5tYXRyaXgoIH4gLiAtIEVBQVJfTGVlLCBkYXRhID0gUmVnX0lucHV0X0RhdGFfQ1ZTX0lUVV9FQUFSX3dhX25vTmEpWywgLTFdXG55cmNfbWF0X0lUVV9zY2FsZWRfQ1ZTX3dhIDwtIHNjYWxlKHlyY19tYXRfSVRVX0NWU193YSlcbnhyY19tYXRfSVRVX3NjYWxlZF9DVlNfd2EgPC0gc2NhbGUoeHJjX21hdF9JVFVfQ1ZTX3dhKVxuYGBgXG5gYGAifQ== -->

```r
```r
yrc_mat_ITU_CVS_wa <- matrix(Reg_Input_Data_CVS_ITU_EAAR_wa_noNa$EAAR_Lee)
xrc_mat_ITU_CVS_wa <- model.matrix( ~ . - EAAR_Lee, data = Reg_Input_Data_CVS_ITU_EAAR_wa_noNa)[, -1]
yrc_mat_ITU_scaled_CVS_wa <- scale(yrc_mat_ITU_CVS_wa)
xrc_mat_ITU_scaled_CVS_wa <- scale(xrc_mat_ITU_CVS_wa)

<!-- rnb-source-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->



<!-- set seed -->
<!-- ```{r} -->
<!-- set.seed(2020) -->
<!-- ``` -->


<!-- ```{r, warning=FALSE} -->
<!-- nboot = 1000 -->

<!-- start_time <- Sys.time() -->
<!-- bootstraps_CVS_ITU_wa <- replicate(nboot, { -->
<!--   rws <- sample(1:nrow(xrc_mat_ITU_scaled_CVS_wa), replace = TRUE) -->
<!--   ensr(xrc_mat_ITU_scaled_CVS_wa[rws, ], yrc_mat_ITU_scaled_CVS_wa[rws, ], standardized = FALSE, family="gaussian", nlambda=100, nfolds=10, alpha=c(0.0,0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1.0)) -->
<!-- }, -->
<!-- simplify = FALSE) -->

<!-- end_time <- Sys.time() -->
<!-- end_time - start_time -->
<!-- # generates a list of length 100, each a unique call to ensr (= also a list of cv.glmnet objects, which is determined by the length of alphas) -->
<!-- # nlambda = number of lambda values, default 100 -->
<!-- # alpha: sequence of alphas to use, ensr will add length(alphas)-1 additional values (midpoints) in the construction of the alpha-lambda grid to search -->
<!-- # nfold= number of folds (default 10) for internal cv to fit hyperparameters -->

<!-- ``` -->


<!-- ```{r} -->
<!-- # save bootstrap object -->
<!-- save(bootstraps_CVS_ITU_wa, file="InputData/Data_ElasticNets/bootstraps_CVS_ITU_wa_1000.Rdata") -->
<!-- ``` -->



<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxubG9hZChcXElucHV0RGF0YS9EYXRhX0VsYXN0aWNOZXRzL2Jvb3RzdHJhcHNfQ1ZTX0lUVV93YV8xMDAwLlJkYXRhXFwpXG5gYGBcbmBgYCJ9 -->

```r
```r
load(\InputData/Data_ElasticNets/bootstraps_CVS_ITU_wa_1000.Rdata\)

<!-- rnb-source-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->




<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuc3VtbWFyaWVzX0NWU19JVFVfd2EgPC1cbiAgYm9vdHN0cmFwc19DVlNfSVRVX3dhICU+JVxuICBsYXBwbHkoc3VtbWFyeSkgJT4lXG4gIHJiaW5kbGlzdChpZGNvbCA9IFwiYm9vdHN0cmFwXCIpXG5cbnN1bW1hcmllc19DVlNfSVRVX3dhXG5gYGAifQ== -->

```r
summaries_CVS_ITU_wa <-
  bootstraps_CVS_ITU_wa %>%
  lapply(summary) %>%
  rbindlist(idcol = "bootstrap")

summaries_CVS_ITU_wa
summaries_CVS_ITU_wa[, .SD[cvm == min(cvm)], by = c("bootstrap", "nzero")] %>%
  ggplot2::ggplot(data = .) +
  ggplot2::aes(x = nzero, y = cvm, group = bootstrap) +
  ggplot2::geom_point() +
  ggplot2::geom_line()
png(filename="Results/Figures/elasticNet_singleTissues/Outcome_add/alcohol/bootstraps_CVS.png", width=800, height=600)
summaries_CVS_ITU_wa[, .SD[cvm == min(cvm)], by = c("bootstrap", "nzero")] %>%
  ggplot2::ggplot(data = .) +
  ggplot2::aes(x = nzero, y = cvm, group = bootstrap) +
  ggplot2::geom_point() +
  ggplot2::geom_line()
dev.off()
```r
load(\InputData/Data_ElasticNets/pm2_CVS_ITU_wa.Rdata\)

<!-- rnb-source-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->




<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuY3N1bW1hcnlfQ1ZTX0lUVV93YSA8LSBSZWR1Y2UoZnVuY3Rpb24oeCx5KSBtZXJnZSh4ID0geCwgeSA9IHksIGJ5ID0gXCJuemVyb1wiKSwgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0KHBtMl9DVlNfSVRVX3dhWywgbGFwcGx5KC5TRCwgZnVuY3Rpb24oeCkge21lYW4oeCAhPSAwKX0pLCAuU0Rjb2xzID0gYyhcIkdlc3RhdGlvbmFsX0FnZV9XZWVrc1wiLCBcIkNoaWxkX1NleGZlbWFsZVwiLCBcIkNoaWxkX0JpcnRoX1dlaWdodFwiLCBcIkNoaWxkX0JpcnRoX0xlbmd0aFwiLCBcIkNoaWxkX0hlYWRfQ2lyY3VtZmVyZW5jZV9BdF9CaXJ0aFwiLCBcIkRlbGl2ZXJ5X21vZGVfZGljaG90b21haWRlZFwiLCBcIkluZHVjZWRfTGFib3VyeWVzXCIsIFwiUGFyaXR5X2RpY2hvdG9tZ2l2ZW4gYmlydGggYmVmb3JlXCIsIFwiTWF0ZXJuYWxfQWdlX1llYXJzXCIsIFwiTWF0ZXJuYWxfQm9keV9NYXNzX0luZGV4X2luX0Vhcmx5X1ByZWduYW5jeVwiLCBcIk1hdGVybmFsX0h5cGVydGVuc2lvbl9kaWNob3RvbWh5cGVydGVuc2lvbiBpbiBjdXJyZW50IHByZWduYW5jeVwiLCBcIk1hdGVybmFsX0RpYWJldGVzX2RpY2hvdG9tZGlhYmV0ZXMgaW4gY3VycmVudCBwcmVnbmFuY3lcIiwgXCJNYXRlcm5hbF9NZW50YWxfRGlzb3JkZXJzWWVzXCIsIFwic21va2luZ19kaWNob3RvbXllc1wiXG4sIFwibWF0ZXJuYWxfYWxjb2hvbF91c2V5ZXNcIiksIGJ5ID0gbnplcm9dXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG0yX0NWU19JVFVfd2FbLCAuKG1lYW5fY3ZtID0gbWVhbihjdm0pKSwgYnkgPSBuemVyb10sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBtMl9DVlNfSVRVX3dhWywgLihtZWRpYW5fY3ZtID0gbWVkaWFuKGN2bSkpLCBieSA9IG56ZXJvXVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSlbb3JkZXIobnplcm8pXVxuXG5jc3VtbWFyeV9DVlNfSVRVX3dhXG5gYGAifQ== -->

```r
csummary_CVS_ITU_wa <- Reduce(function(x,y) merge(x = x, y = y, by = "nzero"), 
                              list(pm2_CVS_ITU_wa[, lapply(.SD, function(x) {mean(x != 0)}), .SDcols = c("Gestational_Age_Weeks", "Child_Sexfemale", "Child_Birth_Weight", "Child_Birth_Length", "Child_Head_Circumference_At_Birth", "Delivery_mode_dichotomaided", "Induced_Labouryes", "Parity_dichotomgiven birth before", "Maternal_Age_Years", "Maternal_Body_Mass_Index_in_Early_Pregnancy", "Maternal_Hypertension_dichotomhypertension in current pregnancy", "Maternal_Diabetes_dichotomdiabetes in current pregnancy", "Maternal_Mental_DisordersYes", "smoking_dichotomyes"
, "maternal_alcohol_useyes"), by = nzero]
                                   ,
                                   pm2_CVS_ITU_wa[, .(mean_cvm = mean(cvm)), by = nzero],
                                   pm2_CVS_ITU_wa[, .(median_cvm = median(cvm)), by = nzero]
                              ))[order(nzero)]

csummary_CVS_ITU_wa
g1_CVS_ITU_wa <-
  csummary_CVS_ITU_wa %>%
  melt(id.vars = c("nzero", "mean_cvm", "median_cvm")) %>%
  ggplot2::ggplot(.) +
  ggplot2::theme_bw() +
  ggplot2::aes(x = nzero) +
  ggplot2::geom_point(mapping = ggplot2::aes(y = variable, size = value, alpha = value, color = value*100)) +
  ggplot2::scale_color_gradient2(high = 'green', mid = "purple", low = "black", midpoint =50)+
  ggplot2::scale_alpha(guide = 'none')+
  ggplot2::scale_size(guide = 'none')+
  ggplot2::scale_y_discrete(labels= c("gestage at birth", "child sex", "birth weight", "birth length", "head circumference", "delivery mode", "induced labor", "parity", "maternal age", "maternal BMI", "maternal hypertension", "maternal diabetes", "maternal mental disorders", "maternal smoking", "maternal alcohol use"))+
  ggplot2::scale_x_continuous(breaks=0:14, labels=)+
  ggplot2::labs(y="predictor", x = "number of non-zero coefficients", color="%")+
  ggplot2::theme(text = element_text(size = 15), axis.title.x= element_text(size=15), axis.title.y= element_text(size=15))
  

g2_CVS_ITU_wa <-
  csummary_CVS_ITU_wa %>%
  ggplot2::ggplot(.) +
  ggplot2::theme_bw() +
  ggplot2::aes(x = nzero, y = median_cvm) +
  ggplot2::geom_point() + ggplot2::geom_line()+
  ggplot2::labs(y="median cvm", x = "number of non-zero coefficients")+
  ggplot2::scale_x_continuous(breaks=0:14, labels=)+
  ggplot2::theme(axis.text=element_text(size=15),axis.title=element_text(size=18))

gridExtra::grid.arrange(g1_CVS_ITU_wa, g2_CVS_ITU_wa, ncol = 1)

# note: not a big difference if mean/median cvm is used
png(filename="Results/Figures/elasticNet_singleTissues/Outcome_add/alcohol/Model_CVS.png", width=2800, height=1400, res=400)
g1_CVS_ITU_wa
dev.off()
png(filename="Results/Figures/elasticNet_singleTissues/Outcome_add/alcohol/bootstrapModels_CVS.png", width=2400, height=1800, res=300)
gridExtra::grid.arrange(g1_CVS_ITU_wa, g2_CVS_ITU_wa, ncol = 1)
dev.off()
elbow_finder(csummary_CVS_ITU_wa$nzero, csummary_CVS_ITU_wa$median_cvm)
nzero_indices_CVS <- data.frame(t(elbow_finder(csummary_CVS_ITU_wa$nzero, csummary_CVS_ITU_wa$median_cvm)))
colnames(nzero_indices_CVS) <- c("x", "y")
rownames(nzero_indices_CVS) <- NULL
nonzero_choose_CVS <- ggplot2::ggplot(csummary_CVS_ITU_wa) +
  ggplot2::theme_bw()+
  ggplot2::aes(x = nzero, y = median_cvm) +
  ggplot2::scale_x_continuous(breaks=c(0:17))+
  ggplot2::geom_point() + ggplot2::geom_line()+
  ggplot2::geom_point(data=nzero_indices_CVS, aes(x=x, y=y), colour="red", size=2)+
  ggplot2::ylab("median of minimum cross-validation errors over bootstraps")+
  ggplot2::xlab("number of non-zero coefficients")+
  ggplot2::geom_segment(aes(x = nzero[1], y = median_cvm[1], xend = nzero[16], yend = median_cvm[16], colour = "segment"), data = csummary_CVS_ITU_wa, show.legend = F)

nonzero_choose_CVS
png(filename="Results/Figures/elasticNet_singleTissues/Outcome_add/alcohol/nzero_choose_CVS.png", width=1600, height=1400, res=300)
nonzero_choose_CVS
dev.off()
```r
nzero_final_CVS_wa <- 10

<!-- rnb-source-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->



<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuY3N1bW1hcnlfQ1ZTX0lUVV93YVtuemVybyAlaW4lIG56ZXJvX2ZpbmFsX0NWU193YV1cbmBgYCJ9 -->

```r
csummary_CVS_ITU_wa[nzero %in% nzero_final_CVS_wa]
```r
summary_CVS_ITU_wa_finalnzero <- csummary_CVS_ITU_wa[nzero %in% nzero_final_CVS_wa]
sig_var_names_CVS_ITU_wa_finalnzero <- Filter(function(x) any(x > 0.75), summary_CVS_ITU_wa_finalnzero[,!c(\nzero\, \mean_cvm\, \median_cvm\)]) %>% colnames()
colnames(summary_CVS_ITU_wa_finalnzero) <- c(\non-zero\, \gestage at birth\, \child sex (female)\, \birth weight\, \birth length\, \head circumference\, \delivery mode (aided)\, \induced labor (yes)\, \parity (birth before)\, \maternal age\, \maternal BMI\, \maternal hypertension (yes)\, \maternal diabetes (yes)\, \maternal mental disorders (yes)\, \maternal smoking (yes)\, \maternal alcohol (yes)\, \mean cvm\, \median cvm\)
summary_CVS_ITU_wa_finalnzeroT <- as.data.frame(t(summary_CVS_ITU_wa_finalnzero[,-c(\non-zero\, \median cvm\, \mean cvm\)]))
summary_CVS_ITU_wa_finalnzeroT$variable <- rownames(summary_CVS_ITU_wa_finalnzeroT)
rownames(summary_CVS_ITU_wa_finalnzeroT) <- NULL
names(summary_CVS_ITU_wa_finalnzeroT)[names(summary_CVS_ITU_wa_finalnzeroT) == 'V1'] <- 'percent'
summary_CVS_ITU_wa_finalnzeroT <- summary_CVS_ITU_wa_finalnzeroT[order(summary_CVS_ITU_wa_finalnzeroT$percent),]

summary_CVS_ITU_wa_finalnzeroT$number <- seq(1, length(summary_CVS_ITU_wa_finalnzeroT$variable))

<!-- rnb-source-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->




<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxucGVyY192YXJzX0NWU19JVFVfd2EgPC0gXG5nZ3Bsb3Qoc3VtbWFyeV9DVlNfSVRVX3dhX2ZpbmFsbnplcm9ULCBhZXMocmVvcmRlcih2YXJpYWJsZSwgcGVyY2VudCksIHBlcmNlbnQsIGdyb3VwPTEpKStcbmdlb21fcG9pbnQoKSsgZ2VvbV9saW5lKCkrXG55bGFiKFwiJSBvY2N1cmVuY2UgaW4gbW9kZWxzIHdpdGggbnplcm8gY29lZmZpY2llbnRzID0gOFwiKStcbnNjYWxlX3lfY29udGludW91cyhicmVha3M9YygwLjEsMC4yLDAuMywwLjQsMC41LDAuNiwwLjcsMC44LDAuOSkpK1xueGxhYihcInZhcmlhYmxlXCIpK1xuY29vcmRfZmxpcCgpK1xuZ2VvbV9obGluZSh5aW50ZXJjZXB0PTAuNzUsIGxpbmV0eXBlPVwiZG90dGVkXCIpK1xudGhlbWVfYncoKVxuXG5wZXJjX3ZhcnNfQ1ZTX0lUVV93YVxuXG4jIGRlY2lkZSBmb3IgY3V0LW9mZiAlIC0+IGhlcmUgLjc1XG5cbkZpbHRlcihmdW5jdGlvbih4KSBhbnkoeCA+IDAuNzUpLCBzdW1tYXJ5X0NWU19JVFVfd2FfZmluYWxuemVyb1ssIWMoXCJub24temVyb1wiLCBcIm1lYW4gY3ZtXCIsIFwibWVkaWFuIGN2bVwiKV0pXG5cbmBgYCJ9 -->

```r
perc_vars_CVS_ITU_wa <- 
ggplot(summary_CVS_ITU_wa_finalnzeroT, aes(reorder(variable, percent), percent, group=1))+
geom_point()+ geom_line()+
ylab("% occurence in models with nzero coefficients = 8")+
scale_y_continuous(breaks=c(0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9))+
xlab("variable")+
coord_flip()+
geom_hline(yintercept=0.75, linetype="dotted")+
theme_bw()

perc_vars_CVS_ITU_wa

# decide for cut-off % -> here .75

Filter(function(x) any(x > 0.75), summary_CVS_ITU_wa_finalnzero[,!c("non-zero", "mean cvm", "median cvm")])
png(filename="Results/Figures/elasticNet_singleTissues/Outcome_add/alcohol/varsPercent_CVS.png", width=1100, height=1400, res=300)
perc_vars_CVS_ITU_wa
dev.off()
pm2_CVS_ITU_wa_coef <-
dcast(pm2_CVS_ITU_wa[,
as.list(unlist(
lapply(.SD,
function(x) {
y <- unname(quantile(x[x != 0], probs = c(0.025, 0.975)))
list("non_zero" = 100 * mean(x != 0),
lcl = y[1],
ucl = y[2],
width = diff(y),
median = median(x[x!= 0]))
}))),
.SDcols = c("Gestational_Age_Weeks", "Child_Sexfemale", "Child_Birth_Weight", "Child_Birth_Length", "Child_Head_Circumference_At_Birth", "Delivery_mode_dichotomaided", "Induced_Labouryes", "Parity_dichotomgiven birth before", "Maternal_Age_Years", "Maternal_Body_Mass_Index_in_Early_Pregnancy", "Maternal_Hypertension_dichotomhypertension in current pregnancy", "Maternal_Diabetes_dichotomdiabetes in current pregnancy", "Maternal_Mental_DisordersYes", "smoking_dichotomyes", "maternal_alcohol_useyes"),
by = nzero][order(nzero)] %>%
melt(id.var = "nzero") %>%
.[, metric := sub("^.+\\.(.+)$", "\\1", variable)] %>%
.[, variable := sub("^(.+)\\..+$", "\\1", variable)] %>%
.[nzero == nzero_final_CVS_wa], nzero+ variable ~ metric, value.var="value")

# get desired order of predictors
pm2_CVS_ITU_wa_coef <-
pm2_CVS_ITU_wa_coef[match(c("Gestational_Age_Weeks", "Child_Sexfemale", "Child_Birth_Weight", "Child_Birth_Length", "Child_Head_Circumference_At_Birth", "Delivery_mode_dichotomaided", "Induced_Labouryes", "Parity_dichotomgiven birth before", "Maternal_Age_Years", "Maternal_Body_Mass_Index_in_Early_Pregnancy", "Maternal_Hypertension_dichotomhypertension in current pregnancy", "Maternal_Diabetes_dichotomdiabetes in current pregnancy", "Maternal_Mental_DisordersYes", "smoking_dichotomyes", "maternal_alcohol_useyes"), pm2_CVS_ITU_wa_coef$variable),]
pm2_CVS_ITU_wa_coef$variable <- factor(pm2_CVS_ITU_wa_coef$variabl, levels=unique(pm2_CVS_ITU_wa_coef$variable))

## NOTE: median is used here instead of mean
# make frame for only significant variables:
pm2_CVS_ITU_wa_datable <- dcast(pm2_CVS_ITU_wa[,
as.list(unlist(
lapply(.SD,
function(x) {
y <- unname(quantile(x[x != 0], probs = c(0.025, 0.975)))
list("non_zero" = 100 * mean(x != 0),
lcl = y[1],
ucl = y[2],
width = diff(y),
median = median(x[x!= 0]))
}))),
.SDcols = c("Gestational_Age_Weeks", "Child_Sexfemale", "Child_Birth_Weight", "Child_Birth_Length", "Child_Head_Circumference_At_Birth", "Delivery_mode_dichotomaided", "Induced_Labouryes", "Parity_dichotomgiven birth before", "Maternal_Age_Years", "Maternal_Body_Mass_Index_in_Early_Pregnancy", "Maternal_Hypertension_dichotomhypertension in current pregnancy", "Maternal_Diabetes_dichotomdiabetes in current pregnancy", "Maternal_Mental_DisordersYes", "smoking_dichotomyes", "maternal_alcohol_useyes"),
by = nzero][order(nzero)] %>%
melt(id.var = "nzero") %>%
.[, metric := sub("^.+\\.(.+)$", "\\1", variable)] %>%
.[, variable := sub("^(.+)\\..+$", "\\1", variable)] %>%
# print %>%
.[nzero == nzero_final_CVS_wa & variable %in% sig_var_names_CVS_ITU_wa_finalnzero], nzero+ variable ~ metric, value.var="value")

pm2_CVS_ITU_wa_datable 
```r
sig_vars_CVS_ITU_wa <-
pm2_CVS_ITU_wa_coef %>%
  ggplot2::ggplot(.) +
  ggplot2::theme_bw() +
  ggplot2::theme(axis.text.x=element_blank())+
  ggplot2::aes(x=\nzero\)+
  ggplot2::geom_point(mapping = ggplot2::aes(y = variable, size =non_zero, alpha = non_zero, color = non_zero)) +
  ggplot2::geom_text(aes(y=variable, label=sprintf(\%0.2f\, round(median, digits=2)), size=30),hjust=0, vjust=0.5, nudge_x = 0.1)+
  ggplot2::scale_color_gradient2(high = 'green', mid = \purple\, low = \black\, midpoint =50)+
  ggplot2::scale_alpha(guide = 'none')+
  ggplot2::scale_size(guide = 'none')+
  ggplot2::scale_y_discrete(labels= c(\gestage at birth\, \child sex (female)\, \birth weight\, \birth length\, \head circumference\, \delivery mode (aided)\, \induced labor (yes)\, \parity (birth before)\, \maternal age\, \maternal BMI\, \maternal hypertension (yes)\, \maternal diabetes (yes)\, \maternal mental disorders (yes)\, \maternal smoking (yes)\, \maternal alcohol use (yes)\))+
  ggplot2::labs(y=\predictor\, x = \number of non-zero coefficients = 8\, color=\%\)

<!-- rnb-source-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->



<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuY29lZl9DVlNfSVRVX3dhIDwtIFxuICBnZ3Bsb3QocG0yX0NWU19JVFVfd2FfY29lZiwgYWVzKHkgPSB2YXJpYWJsZSwgeD1tZWRpYW4pKStcbiAgZ2VvbV9wb2ludChtYXBwaW5nID0gZ2dwbG90Mjo6YWVzKHkgPSB2YXJpYWJsZSwgc2l6ZSA9bm9uX3plcm8sIGFscGhhID0gbm9uX3plcm8sIGNvbG9yID0gbm9uX3plcm8pKStcbiAgc2NhbGVfY29sb3JfZ3JhZGllbnQyKGhpZ2ggPSAnZ3JlZW4nLCBtaWQgPSBcInB1cnBsZVwiLCBsb3cgPSBcImJsYWNrXCIsIG1pZHBvaW50ID01MCwgbGltaXRzPWMoMCwxMDApKStcbiAgc2NhbGVfYWxwaGEoZ3VpZGUgPSAnbm9uZScpK1xuICBzY2FsZV9zaXplKGd1aWRlID0gJ25vbmUnKStcbiAgZ2VvbV9wb2ludCgpK1xuICBnZW9tX2Vycm9yYmFyKGFlcyh5ID0gdmFyaWFibGUsIHhtaW4gPSBsY2wsIHhtYXggPSB1Y2wpLCB3aWR0aCA9IDAuMikrXG4gIGxhYnMoeT1cInByZWRpY3RvclwiLCB4ID0gXCJcXG5tZWRpYW4gJiA5NSUgQ0kgb2YgY29lZmZpY2llbnQgKG92ZXIgYm9vdHN0cmFwcylcIiwgY29sb3I9XCIlXCIpK1xuICBzY2FsZV94X2NvbnRpbnVvdXMobGltaXRzPWMoLTAuNSwwLjQpLCBicmVha3M9YygtLjUsIC0uNCwtLjMsLS4yLCAtLjEsIDAsIC4xLCAuMiwgLjMsIC40KSkrXG4gIHNjYWxlX3lfZGlzY3JldGUobGFiZWxzPSBjKFwiZ2VzdGFnZSBhdCBiaXJ0aFwiLCBcImNoaWxkIHNleCAoZmVtYWxlKVwiLCBcImJpcnRoIHdlaWdodFwiLCBcImJpcnRoIGxlbmd0aFwiLCBcImhlYWQgY2lyY3VtZmVyZW5jZVwiLCBcImRlbGl2ZXJ5IG1vZGUgKGFpZGVkKVwiLCBcImluZHVjZWQgbGFib3IgKHllcylcIiwgXCJwYXJpdHkgKGJpcnRoIGJlZm9yZSlcIiwgXCJtYXRlcm5hbCBhZ2VcIiwgXCJtYXRlcm5hbCBCTUlcIiwgXCJtYXRlcm5hbCBoeXBlcnRlbnNpb24gKHllcylcIiwgXCJtYXRlcm5hbCBkaWFiZXRlcyAoeWVzKVwiLCBcIm1hdGVybmFsIG1lbnRhbCBkaXNvcmRlcnMgKHllcylcIiwgXCJtYXRlcm5hbCBzbW9raW5nICh5ZXMpXCIsIFwibWF0ZXJuYWwgYWxjb2hvbCB1c2UgKHllcylcIikpK1xuICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQ9MCwgbGluZXR5cGU9XCJkYXNoZWRcIikrXG4gIHRoZW1lX2J3KCkrXG4gIHRoZW1lKHRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE1KSwgYXhpcy50aXRsZS54PSBlbGVtZW50X3RleHQoc2l6ZT0xNSksIGF4aXMudGl0bGUueT0gZWxlbWVudF90ZXh0KHNpemU9MTUpKVxuXG5jb2VmX0NWU19JVFVfd2FcbmBgYCJ9 -->

```r
coef_CVS_ITU_wa <- 
  ggplot(pm2_CVS_ITU_wa_coef, aes(y = variable, x=median))+
  geom_point(mapping = ggplot2::aes(y = variable, size =non_zero, alpha = non_zero, color = non_zero))+
  scale_color_gradient2(high = 'green', mid = "purple", low = "black", midpoint =50, limits=c(0,100))+
  scale_alpha(guide = 'none')+
  scale_size(guide = 'none')+
  geom_point()+
  geom_errorbar(aes(y = variable, xmin = lcl, xmax = ucl), width = 0.2)+
  labs(y="predictor", x = "\nmedian & 95% CI of coefficient (over bootstraps)", color="%")+
  scale_x_continuous(limits=c(-0.5,0.4), breaks=c(-.5, -.4,-.3,-.2, -.1, 0, .1, .2, .3, .4))+
  scale_y_discrete(labels= c("gestage at birth", "child sex (female)", "birth weight", "birth length", "head circumference", "delivery mode (aided)", "induced labor (yes)", "parity (birth before)", "maternal age", "maternal BMI", "maternal hypertension (yes)", "maternal diabetes (yes)", "maternal mental disorders (yes)", "maternal smoking (yes)", "maternal alcohol use (yes)"))+
  geom_vline(xintercept=0, linetype="dashed")+
  theme_bw()+
  theme(text = element_text(size = 15), axis.title.x= element_text(size=15), axis.title.y= element_text(size=15))

coef_CVS_ITU_wa
png(filename="Results/Figures/elasticNet_singleTissues/Outcome_add/alcohol/coef_CVS.png", width=2800, height=1400, res=400)
coef_CVS_ITU_wa 
dev.off()
p1 <-
  g1_CVS_ITU_wa <-
  csummary_CVS_ITU_wa %>%
  melt(id.vars = c("nzero", "mean_cvm", "median_cvm")) %>%
  ggplot2::ggplot(.) +
  ggplot2::theme_bw() +
  ggplot2::aes(x = nzero) +
  ggplot2::geom_point(mapping = ggplot2::aes(y = variable, size = value, alpha = value, color = value*100)) +
  ggplot2::scale_color_gradient2(high = 'green', mid = "purple", low = "black", midpoint =50)+
  ggplot2::scale_alpha(guide = 'none')+
  ggplot2::scale_size(guide = 'none')+
  ggplot2::scale_y_discrete(labels= c("gestage at birth", "child sex (female)", "birth weight", "birth length", "head circumference", "delivery mode (aided)", "induced labor (yes)", "parity (birth before)", "maternal age", "maternal BMI", "maternal hypertension (yes)", "maternal diabetes (yes)", "maternal mental disorders (yes)", "maternal smoking (yes)", "maternal alcohol use (yes)"))+
  ggplot2::scale_x_continuous(breaks=0:15, labels=)+
  ggplot2::labs(y="predictor", x = "\nnumber of non-zero coefficients", color="%")+
  ggplot2::theme(text = element_text(size = 17), axis.title.x= element_text(size=15), axis.title.y= element_text(size=15), legend.position = "none")
  
p2 <- 
  ggplot(pm2_CVS_ITU_wa_coef, aes(y = variable, x=median))+
  geom_point(mapping = ggplot2::aes(y = variable, size =non_zero, alpha = non_zero, color = non_zero))+
  scale_color_gradient2(high = 'green', mid = "purple", low = "black", midpoint =50, limits=c(0,100))+
  scale_alpha(guide = 'none')+
  scale_size(guide = 'none')+
  geom_point()+
  geom_errorbar(aes(y = variable, xmin = lcl, xmax = ucl), width = 0.2)+
  labs(y="", x = "\nmedian & 95% CI of coefficient (over bootstraps)", color="%")+
  ggtitle("nzero = 10")+
  scale_x_continuous(limits=c(-0.5,0.4), breaks=c(-.5, -.4,-.3,-.2, -.1, 0, .1, .2, .3, .4))+
  scale_y_discrete(labels= c("gestage at birth", "child sex (female)", "birth weight", "birth length", "head circumference", "delivery mode (aided)", "induced labor (yes)", "parity (birth before)", "maternal age", "maternal BMI", "maternal hypertension (yes)", "maternal diabetes (yes)", "maternal mental disorders (yes)", "maternal smoking (yes)", "maternal alcohol use (yes)"))+
  geom_vline(xintercept=0, linetype="dashed")+
  theme_bw()+
  theme(text = element_text(size = 17), axis.title.x= element_text(size=15), axis.title.y= element_text(size=15), , plot.title = element_text(size=15), axis.text.y=element_blank())

g1 <- ggplotGrob(p1)
g2 <- ggplotGrob(p2)
g <- cbind(g1, g2, size = "last")
g$heights <- unit.pmax(g1$heights, g2$heights)

png(filename="Results/Figures/elasticNet_singleTissues/Outcome_add/alcohol/Model_coef_CVS.png", width=5800, height=1600, res=400)
grid.draw(g)
dev.off()

Placenta elastic net

main model, without alcohol variable

```r
# in case you want to start from here
load(\InputData/ClockCalculationsInput/Reg_Input_Data_Placenta_ITU_EAAR_noNa_n.Rdata\)

<!-- rnb-source-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->




<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxueXJjX21hdF9JVFVfUGxhY2VudGFfbiA8LSBtYXRyaXgoUmVnX0lucHV0X0RhdGFfUGxhY2VudGFfSVRVX0VBQVJfbm9OYV9uJEVBQVJfTGVlKVxueHJjX21hdF9JVFVfUGxhY2VudGFfbiA8LSBtb2RlbC5tYXRyaXgoIH4gLiAtIEVBQVJfTGVlLCBkYXRhID0gUmVnX0lucHV0X0RhdGFfUGxhY2VudGFfSVRVX0VBQVJfbm9OYV9uKVssIC0xXVxueXJjX21hdF9JVFVfc2NhbGVkX1BsYWNlbnRhX24gPC0gc2NhbGUoeXJjX21hdF9JVFVfUGxhY2VudGFfbilcbnhyY19tYXRfSVRVX3NjYWxlZF9QbGFjZW50YV9uIDwtIHNjYWxlKHhyY19tYXRfSVRVX1BsYWNlbnRhX24pXG5gYGBcbmBgYCJ9 -->

```r
```r
yrc_mat_ITU_Placenta_n <- matrix(Reg_Input_Data_Placenta_ITU_EAAR_noNa_n$EAAR_Lee)
xrc_mat_ITU_Placenta_n <- model.matrix( ~ . - EAAR_Lee, data = Reg_Input_Data_Placenta_ITU_EAAR_noNa_n)[, -1]
yrc_mat_ITU_scaled_Placenta_n <- scale(yrc_mat_ITU_Placenta_n)
xrc_mat_ITU_scaled_Placenta_n <- scale(xrc_mat_ITU_Placenta_n)

<!-- rnb-source-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->


<!-- set seed -->
<!-- ```{r} -->
<!-- set.seed(2020) -->
<!-- ``` -->


<!-- ```{r, warning=F} -->
<!--   nboot = 1000 -->

<!--   start_time <- Sys.time() -->
<!--   bootstraps_Placenta_ITU_n <- replicate(nboot, { -->
<!--     rws <- sample(1:nrow(xrc_mat_ITU_scaled_Placenta_n), replace = TRUE) -->
<!--     ensr(xrc_mat_ITU_scaled_Placenta_n[rws, ], yrc_mat_ITU_scaled_Placenta_n[rws, ], standardized = FALSE, family="gaussian", nlambda=100, nfolds=10, alpha=c(0.0,0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1.0)) -->
<!--   }, -->
<!--   simplify = FALSE) -->

<!--   end_time <- Sys.time() -->
<!--   end_time - start_time -->

<!--   #Time difference of 3.159319 hours -->

<!-- ``` -->

<!-- ```{r} -->
<!-- save(bootstraps_Placenta_ITU_n, file="InputData/Data_ElasticNets/bootstraps_Placenta_ITU_n_1000.Rdata") -->
<!-- ``` -->



<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxubG9hZChcXElucHV0RGF0YS9EYXRhX0VsYXN0aWNOZXRzL2Jvb3RzdHJhcHNfUGxhY2VudGFfSVRVX25fMTAwMC5SZGF0YVxcKVxuYGBgXG5gYGAifQ== -->

```r
```r
load(\InputData/Data_ElasticNets/bootstraps_Placenta_ITU_n_1000.Rdata\)

<!-- rnb-source-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->




<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuc3VtbWFyaWVzX1BsYWNlbnRhX0lUVV9uIDwtXG4gIGJvb3RzdHJhcHNfUGxhY2VudGFfSVRVX24gJT4lXG4gIGxhcHBseShzdW1tYXJ5KSAlPiVcbiAgcmJpbmRsaXN0KGlkY29sID0gXCJib290c3RyYXBcIilcblxuc3VtbWFyaWVzX1BsYWNlbnRhX0lUVV9uXG5gYGAifQ== -->

```r
summaries_Placenta_ITU_n <-
  bootstraps_Placenta_ITU_n %>%
  lapply(summary) %>%
  rbindlist(idcol = "bootstrap")

summaries_Placenta_ITU_n
summaries_Placenta_ITU_n[, .SD[cvm == min(cvm)], by = c("bootstrap", "nzero")] %>%
  ggplot2::ggplot(data = .) +
  ggplot2::aes(x = nzero, y = cvm, group = bootstrap) +
  ggplot2::geom_point() +
  ggplot2::geom_line()
png(filename="Results/Figures/elasticNet_singleTissues/Outcome_main/bootstraps_Placenta.png", width=800, height=600)
summaries_Placenta_ITU_n[, .SD[cvm == min(cvm)], by = c("bootstrap", "nzero")] %>%
  ggplot2::ggplot(data = .) +
  ggplot2::aes(x = nzero, y = cvm, group = bootstrap) +
  ggplot2::geom_point() +
  ggplot2::geom_line()
dev.off()
```r
load(\InputData/Data_ElasticNets/pm2_Placenta_ITU_n.Rdata\)
# coefficient values for the models with smallest cvm by number of non-erzo coefficients and bootstrap

<!-- rnb-source-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->




<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuY3N1bW1hcnlfUGxhY2VudGFfSVRVX24gPC0gUmVkdWNlKGZ1bmN0aW9uKHgseSkgbWVyZ2UoeCA9IHgsIHkgPSB5LCBieSA9IFwibnplcm9cIiksIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0KHBtMl9QbGFjZW50YV9JVFVfblssIGxhcHBseSguU0QsIGZ1bmN0aW9uKHgpIHttZWFuKHggIT0gMCl9KSwgLlNEY29scyA9IGMoXCJDaGlsZF9TZXhmZW1hbGVcIiwgXCJDaGlsZF9CaXJ0aF9XZWlnaHRcIiwgXCJDaGlsZF9CaXJ0aF9MZW5ndGhcIiwgXCJDaGlsZF9IZWFkX0NpcmN1bWZlcmVuY2VfQXRfQmlydGhcIiwgXCJEZWxpdmVyeV9tb2RlX2RpY2hvdG9tYWlkZWRcIiwgXCJJbmR1Y2VkX0xhYm91cnllc1wiLCBcIlBhcml0eV9kaWNob3RvbWdpdmVuIGJpcnRoIGJlZm9yZVwiLCBcIk1hdGVybmFsX0FnZV9ZZWFyc1wiLCBcIk1hdGVybmFsX0JvZHlfTWFzc19JbmRleF9pbl9FYXJseV9QcmVnbmFuY3lcIiwgXCJNYXRlcm5hbF9IeXBlcnRlbnNpb25fZGljaG90b21oeXBlcnRlbnNpb24gaW4gY3VycmVudCBwcmVnbmFuY3lcIiwgXCJNYXRlcm5hbF9EaWFiZXRlc19kaWNob3RvbWRpYWJldGVzIGluIGN1cnJlbnQgcHJlZ25hbmN5XCIsIFwiTWF0ZXJuYWxfTWVudGFsX0Rpc29yZGVyc1llc1wiLCBcInNtb2tpbmdfZGljaG90b215ZXNcIiksIGJ5ID0gbnplcm9dXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBtMl9QbGFjZW50YV9JVFVfblssIC4obWVhbl9jdm0gPSBtZWFuKGN2bSkpLCBieSA9IG56ZXJvXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbTJfUGxhY2VudGFfSVRVX25bLCAuKG1lZGlhbl9jdm0gPSBtZWRpYW4oY3ZtKSksIGJ5ID0gbnplcm9dXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkpW29yZGVyKG56ZXJvKV1cblxuY3N1bW1hcnlfUGxhY2VudGFfSVRVX25cbmBgYCJ9 -->

```r
csummary_Placenta_ITU_n <- Reduce(function(x,y) merge(x = x, y = y, by = "nzero"), 
                                   list(pm2_Placenta_ITU_n[, lapply(.SD, function(x) {mean(x != 0)}), .SDcols = c("Child_Sexfemale", "Child_Birth_Weight", "Child_Birth_Length", "Child_Head_Circumference_At_Birth", "Delivery_mode_dichotomaided", "Induced_Labouryes", "Parity_dichotomgiven birth before", "Maternal_Age_Years", "Maternal_Body_Mass_Index_in_Early_Pregnancy", "Maternal_Hypertension_dichotomhypertension in current pregnancy", "Maternal_Diabetes_dichotomdiabetes in current pregnancy", "Maternal_Mental_DisordersYes", "smoking_dichotomyes"), by = nzero]
                                        ,
                                        pm2_Placenta_ITU_n[, .(mean_cvm = mean(cvm)), by = nzero],
                                        pm2_Placenta_ITU_n[, .(median_cvm = median(cvm)), by = nzero]
                                   ))[order(nzero)]

csummary_Placenta_ITU_n
g1_Placenta_ITU_n <-
  csummary_Placenta_ITU_n %>%
  melt(id.vars = c("nzero", "mean_cvm", "median_cvm")) %>%
  ggplot2::ggplot(.) +
  ggplot2::theme_bw() +
  ggplot2::aes(x = nzero) +
  ggplot2::geom_point(mapping = ggplot2::aes(y = variable, size = value, alpha = value, color = value*100)) +
  ggplot2::scale_color_gradient2(high = 'green', mid = "purple", low = "black", midpoint =50)+
  ggplot2::scale_alpha(guide = 'none')+
  ggplot2::scale_size(guide = 'none')+
  ggplot2::scale_y_discrete(labels= c("child sex", "birth weight", "birth length", "head circumference", "delivery mode", "induced labor", "parity", "maternal age", "maternal BMI", "maternal hypertension", "maternal diabetes", "maternal mental disorders", "maternal smoking"))+
  ggplot2::scale_x_continuous(breaks=0:14, labels=)+
  ggplot2::labs(y="predictor", x = "number of non-zero coefficients", color="%")+
  ggplot2::theme(text = element_text(size = 15), axis.title.x= element_text(size=15), axis.title.y= element_text(size=15))

g2_Placenta_ITU_n <-
  csummary_Placenta_ITU_n %>%
  ggplot2::ggplot(.) +
  ggplot2::theme_bw() +
  ggplot2::aes(x = nzero, y = median_cvm) +
  ggplot2::geom_point() + ggplot2::geom_line()+
  ggplot2::labs(y="median cvm", x = "number of non-zero coefficients")+
  ggplot2::scale_x_continuous(breaks=0:14, labels=)+
  ggplot2::theme(axis.text=element_text(size=15),axis.title=element_text(size=18))



gridExtra::grid.arrange(g1_Placenta_ITU_n, g2_Placenta_ITU_n, ncol = 1)
png(filename="Results/Figures/elasticNet_singleTissues/Outcome_main/bootstrapModels_Placenta.png", width=2400, height=1800, res=300)
gridExtra::grid.arrange(g1_Placenta_ITU_n, g2_Placenta_ITU_n, ncol = 1)
dev.off()
png(filename="Results/Figures/elasticNet_singleTissues/Outcome_main/Model_Placenta.png", width=2800, height=1400, res=400)
g1_Placenta_ITU_n
dev.off()
elbow_finder(csummary_Placenta_ITU_n$nzero, csummary_Placenta_ITU_n$median_cvm)

nzero_indices_Placenta <- data.frame(t(elbow_finder(csummary_Placenta_ITU_n$nzero, csummary_Placenta_ITU_n$median_cvm)))
colnames(nzero_indices_Placenta) <- c("x", "y")
rownames(nzero_indices_Placenta) <- NULL
```r
nzero_final_placenta_itu <- 7

<!-- rnb-source-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->




<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxuc3VtbWFyeV9QbGFjZW50YV9JVFVfbl9maW5hbG56ZXJvIDwtIGNzdW1tYXJ5X1BsYWNlbnRhX0lUVV9uW256ZXJvICVpbiUgbnplcm9fZmluYWxfcGxhY2VudGFfaXR1XVxuc2lnX3Zhcl9uYW1lc19QbGFjZW50YV9JVFVfbl9maW5hbG56ZXJvIDwtIEZpbHRlcihmdW5jdGlvbih4KSBhbnkoeCA+IDAuNzUpLCBzdW1tYXJ5X1BsYWNlbnRhX0lUVV9uX2ZpbmFsbnplcm9bLCFjKFxcbnplcm9cXCwgXFxtZWFuX2N2bVxcLCBcXG1lZGlhbl9jdm1cXCldKSAlPiUgY29sbmFtZXMoKVxuY29sbmFtZXMoc3VtbWFyeV9QbGFjZW50YV9JVFVfbl9maW5hbG56ZXJvKSA8LSBjKFxcbm9uLXplcm9cXCxcXGNoaWxkIHNleCAoZmVtYWxlKVxcLCBcXGJpcnRoIHdlaWdodFxcLCBcXGJpcnRoIGxlbmd0aFxcLCBcXGhlYWQgY2lyY3VtZmVyZW5jZVxcLCBcXGRlbGl2ZXJ5IG1vZGUgKGFpZGVkKVxcLCBcXGluZHVjZWQgbGFib3IgKHllcylcXCwgXFxwYXJpdHkgKGJpcnRoIGJlZm9yZSlcXCwgXFxtYXRlcm5hbCBhZ2VcXCwgXFxtYXRlcm5hbCBCTUlcXCwgXFxtYXRlcm5hbCBoeXBlcnRlbnNpb24gKHllcylcXCwgXFxtYXRlcm5hbCBkaWFiZXRlcyAoeWVzKVxcLCBcXG1hdGVybmFsIG1lbnRhbCBkaXNvcmRlcnMgKHllcylcXCwgXFxtYXRlcm5hbCBzbW9raW5nICh5ZXMpXFwsIFxcbWVhbiBjdm1cXCwgXFxtZWRpYW4gY3ZtXFwpXG5zdW1tYXJ5X1BsYWNlbnRhX0lUVV9uX2ZpbmFsbnplcm9UIDwtIGFzLmRhdGEuZnJhbWUodChzdW1tYXJ5X1BsYWNlbnRhX0lUVV9uX2ZpbmFsbnplcm9bLC1jKFxcbm9uLXplcm9cXCwgXFxtZWRpYW4gY3ZtXFwsIFxcbWVhbiBjdm1cXCldKSlcbnN1bW1hcnlfUGxhY2VudGFfSVRVX25fZmluYWxuemVyb1QkdmFyaWFibGUgPC0gcm93bmFtZXMoc3VtbWFyeV9QbGFjZW50YV9JVFVfbl9maW5hbG56ZXJvVClcbnJvd25hbWVzKHN1bW1hcnlfUGxhY2VudGFfSVRVX25fZmluYWxuemVyb1QpIDwtIE5VTExcbm5hbWVzKHN1bW1hcnlfUGxhY2VudGFfSVRVX25fZmluYWxuemVyb1QpW25hbWVzKHN1bW1hcnlfUGxhY2VudGFfSVRVX25fZmluYWxuemVyb1QpID09ICdWMSddIDwtICdwZXJjZW50J1xuc3VtbWFyeV9QbGFjZW50YV9JVFVfbl9maW5hbG56ZXJvVCA8LSBzdW1tYXJ5X1BsYWNlbnRhX0lUVV9uX2ZpbmFsbnplcm9UW29yZGVyKHN1bW1hcnlfUGxhY2VudGFfSVRVX25fZmluYWxuemVyb1QkcGVyY2VudCksXVxuXG5zdW1tYXJ5X1BsYWNlbnRhX0lUVV9uX2ZpbmFsbnplcm9UJG51bWJlciA8LSBzZXEoMSwgbGVuZ3RoKHN1bW1hcnlfUGxhY2VudGFfSVRVX25fZmluYWxuemVyb1QkdmFyaWFibGUpKVxuYGBgXG5gYGAifQ== -->

```r
```r
summary_Placenta_ITU_n_finalnzero <- csummary_Placenta_ITU_n[nzero %in% nzero_final_placenta_itu]
sig_var_names_Placenta_ITU_n_finalnzero <- Filter(function(x) any(x > 0.75), summary_Placenta_ITU_n_finalnzero[,!c(\nzero\, \mean_cvm\, \median_cvm\)]) %>% colnames()
colnames(summary_Placenta_ITU_n_finalnzero) <- c(\non-zero\,\child sex (female)\, \birth weight\, \birth length\, \head circumference\, \delivery mode (aided)\, \induced labor (yes)\, \parity (birth before)\, \maternal age\, \maternal BMI\, \maternal hypertension (yes)\, \maternal diabetes (yes)\, \maternal mental disorders (yes)\, \maternal smoking (yes)\, \mean cvm\, \median cvm\)
summary_Placenta_ITU_n_finalnzeroT <- as.data.frame(t(summary_Placenta_ITU_n_finalnzero[,-c(\non-zero\, \median cvm\, \mean cvm\)]))
summary_Placenta_ITU_n_finalnzeroT$variable <- rownames(summary_Placenta_ITU_n_finalnzeroT)
rownames(summary_Placenta_ITU_n_finalnzeroT) <- NULL
names(summary_Placenta_ITU_n_finalnzeroT)[names(summary_Placenta_ITU_n_finalnzeroT) == 'V1'] <- 'percent'
summary_Placenta_ITU_n_finalnzeroT <- summary_Placenta_ITU_n_finalnzeroT[order(summary_Placenta_ITU_n_finalnzeroT$percent),]

summary_Placenta_ITU_n_finalnzeroT$number <- seq(1, length(summary_Placenta_ITU_n_finalnzeroT$variable))

<!-- rnb-source-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->



<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxucGVyY192YXJzX1BsYWNlbnRhX0lUVV9uIDwtIFxuICBnZ3Bsb3Qoc3VtbWFyeV9QbGFjZW50YV9JVFVfbl9maW5hbG56ZXJvVCwgYWVzKHJlb3JkZXIodmFyaWFibGUsIHBlcmNlbnQpLCBwZXJjZW50LCBncm91cD0xKSkrXG4gIGdlb21fcG9pbnQoKSsgZ2VvbV9saW5lKCkrXG4gIHlsYWIoXCIlIG9jY3VyZW5jZSBpbiBtb2RlbHMgd2l0aCBuemVybyBjb2VmZmljaWVudHMgPSA0XCIpK1xuICBzY2FsZV95X2NvbnRpbnVvdXMoYnJlYWtzPWMoMC4xLDAuMiwwLjMsMC40LDAuNSwwLjYsMC43LDAuOCwwLjkpKStcbiAgeGxhYihcInZhcmlhYmxlXCIpK1xuICBjb29yZF9mbGlwKCkrXG4gIGdlb21faGxpbmUoeWludGVyY2VwdD0wLjc1LCBsaW5ldHlwZT1cImRvdHRlZFwiKStcbiAgdGhlbWVfYncoKVxuXG5wZXJjX3ZhcnNfUGxhY2VudGFfSVRVX25cblxuIyBkZWNpZGUgZm9yIGN1dC1vZmYgJSAtPiBoZXJlIC43NVxuXG5GaWx0ZXIoZnVuY3Rpb24oeCkgYW55KHggPiAwLjc1KSwgc3VtbWFyeV9QbGFjZW50YV9JVFVfbl9maW5hbG56ZXJvWywhYyhcIm5vbi16ZXJvXCIsIFwibWVhbiBjdm1cIiwgXCJtZWRpYW4gY3ZtXCIpXSlcbmBgYCJ9 -->

```r
perc_vars_Placenta_ITU_n <- 
  ggplot(summary_Placenta_ITU_n_finalnzeroT, aes(reorder(variable, percent), percent, group=1))+
  geom_point()+ geom_line()+
  ylab("% occurence in models with nzero coefficients = 4")+
  scale_y_continuous(breaks=c(0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9))+
  xlab("variable")+
  coord_flip()+
  geom_hline(yintercept=0.75, linetype="dotted")+
  theme_bw()

perc_vars_Placenta_ITU_n

# decide for cut-off % -> here .75

Filter(function(x) any(x > 0.75), summary_Placenta_ITU_n_finalnzero[,!c("non-zero", "mean cvm", "median cvm")])
png(filename="Results/Figures/elasticNet_singleTissues/Outcome_main/varsPercent_Placenta.png", width=1800, height=1400, res=300)
perc_vars_Placenta_ITU_n
dev.off()
```r
pm2_Placenta_ITU_n_coef <-
  dcast(pm2_Placenta_ITU_n[,
                        as.list(unlist(
                          lapply(.SD,
                                 function(x) {
                                   y <- unname(quantile(x[x != 0], probs = c(0.025, 0.975)))
                                   list(\non_zero\ = 100 * mean(x != 0),
                                        lcl = y[1],
                                        ucl = y[2],
                                        width = diff(y),
                                        median = median(x[x!= 0]))
                                 }))),
                        .SDcols = c(\Child_Sexfemale\, \Child_Birth_Weight\, \Child_Birth_Length\, \Child_Head_Circumference_At_Birth\, \Delivery_mode_dichotomaided\, \Induced_Labouryes\, \Parity_dichotomgiven birth before\, \Maternal_Age_Years\, \Maternal_Body_Mass_Index_in_Early_Pregnancy\, \Maternal_Hypertension_dichotomhypertension in current pregnancy\, \Maternal_Diabetes_dichotomdiabetes in current pregnancy\, \Maternal_Mental_DisordersYes\, \smoking_dichotomyes\),
                        by = nzero][order(nzero)] %>%
          melt(id.var = \nzero\) %>%
          .[, metric := sub(\^.+\\.(.+)$\, \\\1\, variable)] %>%
          .[, variable := sub(\^(.+)\\..+$\, \\\1\, variable)] %>%
          .[nzero == nzero_final_placenta_itu], nzero+ variable ~ metric, value.var=\value\)

# get desired order of predictors
pm2_Placenta_ITU_n_coef <-
  pm2_Placenta_ITU_n_coef[match(c(\Child_Sexfemale\, \Child_Birth_Weight\, \Child_Birth_Length\, \Child_Head_Circumference_At_Birth\, \Delivery_mode_dichotomaided\, \Induced_Labouryes\, \Parity_dichotomgiven birth before\, \Maternal_Age_Years\, \Maternal_Body_Mass_Index_in_Early_Pregnancy\, \Maternal_Hypertension_dichotomhypertension in current pregnancy\, \Maternal_Diabetes_dichotomdiabetes in current pregnancy\, \Maternal_Mental_DisordersYes\, \smoking_dichotomyes\), pm2_Placenta_ITU_n_coef$variable),]
pm2_Placenta_ITU_n_coef$variable <- factor(pm2_Placenta_ITU_n_coef$variabl, levels=unique(pm2_Placenta_ITU_n_coef$variable))

<!-- rnb-source-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->



<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxud3JpdGVfeGxzeChwbTJfUGxhY2VudGFfSVRVX25fY29lZixcXFJlc3VsdHMvVGFibGVzL0NvZWZmaWNpZW50c01vZGVsX1BsYWNlbnRhLnhsc3hcXClcbmBgYFxuYGBgIn0= -->

```r
```r
write_xlsx(pm2_Placenta_ITU_n_coef,\Results/Tables/CoefficientsModel_Placenta.xlsx\)

<!-- rnb-source-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->




<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxuc2lnX3ZhcnNfUGxhY2VudGFfSVRVX24gPC1cbiAgcG0yX1BsYWNlbnRhX0lUVV9uX2NvZWYgJT4lXG4gIGdncGxvdDI6OmdncGxvdCguKSArXG4gIGdncGxvdDI6OnRoZW1lX2J3KCkgK1xuICBnZ3Bsb3QyOjp0aGVtZShheGlzLnRleHQueD1lbGVtZW50X2JsYW5rKCkpK1xuICBnZ3Bsb3QyOjphZXMoeD1cXG56ZXJvXFwpK1xuICBnZ3Bsb3QyOjpnZW9tX3BvaW50KG1hcHBpbmcgPSBnZ3Bsb3QyOjphZXMoeSA9IHZhcmlhYmxlLCBzaXplID1ub25femVybywgYWxwaGEgPSBub25femVybywgY29sb3IgPSBub25femVybykpICtcbiAgZ2dwbG90Mjo6Z2VvbV90ZXh0KGFlcyh5PXZhcmlhYmxlLCBsYWJlbD1zcHJpbnRmKFxcJTAuMmZcXCwgcm91bmQobWVkaWFuLCBkaWdpdHM9MikpLCBzaXplPTUwKSxoanVzdD0wLCB2anVzdD0wLjUsIG51ZGdlX3ggPSAwLjEpK1xuICBnZ3Bsb3QyOjpzY2FsZV9jb2xvcl9ncmFkaWVudDIoaGlnaCA9ICdncmVlbicsIG1pZCA9IFxccHVycGxlXFwsIGxvdyA9IFxcYmxhY2tcXCwgbWlkcG9pbnQgPTUwKStcbiAgZ2dwbG90Mjo6c2NhbGVfYWxwaGEoZ3VpZGUgPSAnbm9uZScpK1xuICBnZ3Bsb3QyOjpzY2FsZV9zaXplKGd1aWRlID0gJ25vbmUnKStcbiAgZ2dwbG90Mjo6c2NhbGVfeV9kaXNjcmV0ZShsYWJlbHM9IGMoXFxjaGlsZCBzZXggKGZlbWFsZSlcXCwgXFxiaXJ0aCB3ZWlnaHRcXCwgXFxiaXJ0aCBsZW5ndGhcXCwgXFxoZWFkIGNpcmN1bWZlcmVuY2VcXCwgXFxkZWxpdmVyeSBtb2RlIChhaWRlZClcXCwgXFxpbmR1Y2VkIGxhYm9yICh5ZXMpXFwsIFxccGFyaXR5IChiaXJ0aCBiZWZvcmUpXFwsIFxcbWF0ZXJuYWwgYWdlXFwsIFxcbWF0ZXJuYWwgQk1JXFwsIFxcbWF0ZXJuYWwgaHlwZXJ0ZW5zaW9uICh5ZXMpXFwsIFxcbWF0ZXJuYWwgZGlhYmV0ZXMgKHllcylcXCwgXFxtYXRlcm5hbCBtZW50YWwgZGlzb3JkZXJzICh5ZXMpXFwsIFxcbWF0ZXJuYWwgc21va2luZyAoeWVzKVxcLCBcXG1hdGVybmFsIGFsY29ob2wgdXNlICh5ZXMpXFwpKStcbiAgZ2dwbG90Mjo6bGFicyh5PVxccHJlZGljdG9yXFwsIHggPSBcXG51bWJlciBvZiBub24temVybyBjb2VmZmljaWVudHMgPSA3XFwsIGNvbG9yPVxcJVxcKVxuXG5gYGBcbmBgYCJ9 -->

```r
```r
sig_vars_Placenta_ITU_n <-
  pm2_Placenta_ITU_n_coef %>%
  ggplot2::ggplot(.) +
  ggplot2::theme_bw() +
  ggplot2::theme(axis.text.x=element_blank())+
  ggplot2::aes(x=\nzero\)+
  ggplot2::geom_point(mapping = ggplot2::aes(y = variable, size =non_zero, alpha = non_zero, color = non_zero)) +
  ggplot2::geom_text(aes(y=variable, label=sprintf(\%0.2f\, round(median, digits=2)), size=50),hjust=0, vjust=0.5, nudge_x = 0.1)+
  ggplot2::scale_color_gradient2(high = 'green', mid = \purple\, low = \black\, midpoint =50)+
  ggplot2::scale_alpha(guide = 'none')+
  ggplot2::scale_size(guide = 'none')+
  ggplot2::scale_y_discrete(labels= c(\child sex (female)\, \birth weight\, \birth length\, \head circumference\, \delivery mode (aided)\, \induced labor (yes)\, \parity (birth before)\, \maternal age\, \maternal BMI\, \maternal hypertension (yes)\, \maternal diabetes (yes)\, \maternal mental disorders (yes)\, \maternal smoking (yes)\, \maternal alcohol use (yes)\))+
  ggplot2::labs(y=\predictor\, x = \number of non-zero coefficients = 7\, color=\%\)

<!-- rnb-source-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->



<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuY29lZl9QbGFjZW50YV9JVFVfbiA8LSBcbiAgZ2dwbG90KHBtMl9QbGFjZW50YV9JVFVfbl9jb2VmLCBhZXMoeSA9IHZhcmlhYmxlLCB4PW1lZGlhbikpK1xuICBnZW9tX3BvaW50KG1hcHBpbmcgPSBnZ3Bsb3QyOjphZXMoeSA9IHZhcmlhYmxlLCBzaXplID1ub25femVybywgYWxwaGEgPSBub25femVybywgY29sb3IgPSBub25femVybykpK1xuICBzY2FsZV9jb2xvcl9ncmFkaWVudDIoaGlnaCA9ICdncmVlbicsIG1pZCA9IFwicHVycGxlXCIsIGxvdyA9IFwiYmxhY2tcIiwgbWlkcG9pbnQgPTUwLCBsaW1pdHM9YygwLDEwMCkpK1xuICBzY2FsZV9hbHBoYShndWlkZSA9ICdub25lJykrXG4gIHNjYWxlX3NpemUoZ3VpZGUgPSAnbm9uZScpK1xuICBnZW9tX3BvaW50KCkrXG4gIGdlb21fZXJyb3JiYXIoYWVzKHkgPSB2YXJpYWJsZSwgeG1pbiA9IGxjbCwgeG1heCA9IHVjbCksIHdpZHRoID0gMC4yKStcbiAgbGFicyh5PVwicHJlZGljdG9yXCIsIHggPSBcIlxcbm1lZGlhbiAmIDk1JSBDSSBvZiBjb2VmZmljaWVudCAob3ZlciBib290c3RyYXBzKVwiLCBjb2xvcj1cIiVcIikrXG4gIHNjYWxlX3hfY29udGludW91cyhsaW1pdHM9YygtMC40LDAuNCksIGJyZWFrcz1jKC0uNCwtLjMsLS4yLCAtLjEsIDAsIC4xLCAuMiwgLjMsIC40KSkrXG4gIHNjYWxlX3lfZGlzY3JldGUobGFiZWxzPSBjKFwiY2hpbGQgc2V4IChmZW1hbGUpXCIsIFwiYmlydGggd2VpZ2h0XCIsIFwiYmlydGggbGVuZ3RoXCIsIFwiaGVhZCBjaXJjdW1mZXJlbmNlXCIsIFwiZGVsaXZlcnkgbW9kZSAoYWlkZWQpXCIsIFwiaW5kdWNlZCBsYWJvciAoeWVzKVwiLCBcInBhcml0eSAoYmlydGggYmVmb3JlKVwiLCBcIm1hdGVybmFsIGFnZVwiLCBcIm1hdGVybmFsIEJNSVwiLCBcIm1hdGVybmFsIGh5cGVydGVuc2lvbiAoeWVzKVwiLCBcIm1hdGVybmFsIGRpYWJldGVzICh5ZXMpXCIsIFwibWF0ZXJuYWwgbWVudGFsIGRpc29yZGVycyAoeWVzKVwiLCBcIm1hdGVybmFsIHNtb2tpbmcgKHllcylcIiwgXCJtYXRlcm5hbCBhbGNvaG9sIHVzZSAoeWVzKVwiKSkrXG4gIGdlb21fdmxpbmUoeGludGVyY2VwdD0wLCBsaW5ldHlwZT1cImRhc2hlZFwiKStcbiAgdGhlbWVfYncoKStcbiAgdGhlbWUodGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTUpLCBheGlzLnRpdGxlLng9IGVsZW1lbnRfdGV4dChzaXplPTE1KSwgYXhpcy50aXRsZS55PSBlbGVtZW50X3RleHQoc2l6ZT0xNSkpXG5cblxuY29lZl9QbGFjZW50YV9JVFVfbiBcbmBgYCJ9 -->

```r
coef_Placenta_ITU_n <- 
  ggplot(pm2_Placenta_ITU_n_coef, aes(y = variable, x=median))+
  geom_point(mapping = ggplot2::aes(y = variable, size =non_zero, alpha = non_zero, color = non_zero))+
  scale_color_gradient2(high = 'green', mid = "purple", low = "black", midpoint =50, limits=c(0,100))+
  scale_alpha(guide = 'none')+
  scale_size(guide = 'none')+
  geom_point()+
  geom_errorbar(aes(y = variable, xmin = lcl, xmax = ucl), width = 0.2)+
  labs(y="predictor", x = "\nmedian & 95% CI of coefficient (over bootstraps)", color="%")+
  scale_x_continuous(limits=c(-0.4,0.4), breaks=c(-.4,-.3,-.2, -.1, 0, .1, .2, .3, .4))+
  scale_y_discrete(labels= c("child sex (female)", "birth weight", "birth length", "head circumference", "delivery mode (aided)", "induced labor (yes)", "parity (birth before)", "maternal age", "maternal BMI", "maternal hypertension (yes)", "maternal diabetes (yes)", "maternal mental disorders (yes)", "maternal smoking (yes)", "maternal alcohol use (yes)"))+
  geom_vline(xintercept=0, linetype="dashed")+
  theme_bw()+
  theme(text = element_text(size = 15), axis.title.x= element_text(size=15), axis.title.y= element_text(size=15))


coef_Placenta_ITU_n 
png(filename="Results/Figures/elasticNet_singleTissues/Outcome_main/coef_Placenta.png", width=2800, height=1400, res=400)
coef_Placenta_ITU_n
dev.off()
p1 <-
  csummary_Placenta_ITU_n %>%
  melt(id.vars = c("nzero", "mean_cvm", "median_cvm")) %>%
  ggplot2::ggplot(.) +
  ggplot2::theme_bw() +
  ggplot2::aes(x = nzero) +
  ggplot2::geom_point(mapping = ggplot2::aes(y = variable, size = value, alpha = value, color = value*100)) +
  ggplot2::scale_color_gradient2(high = 'green', mid = "purple", low = "black", midpoint =50)+
  ggplot2::scale_alpha(guide = 'none')+
  ggplot2::scale_size(guide = 'none')+
  ggplot2::scale_y_discrete(labels= c("child sex (female)", "birth weight", "birth length", "head circumference", "delivery mode (aided)", "induced labor (yes)", "parity (birth before)", "maternal age", "maternal BMI", "maternal hypertension (yes)", "maternal diabetes (yes)", "maternal mental disorders (yes)", "maternal smoking (yes)", "maternal alcohol use (yes)"))+
  ggplot2::scale_x_continuous(breaks=0:14, labels=)+
  ggplot2::labs(y="predictor", x = "\nnumber of non-zero coefficients", color="%")+
  ggplot2::theme(text = element_text(size =17), axis.title.x= element_text(size=15), axis.title.y= element_text(size=15), legend.position = "none")
  
p2 <- 
  ggplot(pm2_Placenta_ITU_n_coef, aes(y = variable, x=median))+
  geom_point(mapping = ggplot2::aes(y = variable, size =non_zero, alpha = non_zero, color = non_zero))+
  scale_color_gradient2(high = 'green', mid = "purple", low = "black", midpoint =50, limits=c(0,100))+
  scale_alpha(guide = 'none')+
  scale_size(guide = 'none')+
  geom_point()+
  geom_errorbar(aes(y = variable, xmin = lcl, xmax = ucl), width = 0.2)+
  labs(y="", x = "\nmedian & 95% CI of coefficient (over bootstraps)", color="%")+
  scale_x_continuous(limits=c(-0.4,0.4), breaks=c(-.4,-.3,-.2, -.1, 0, .1, .2, .3, .4))+
  scale_y_discrete(labels= c("child sex (female)", "birth weight", "birth length", "head circumference", "delivery mode (aided)", "induced labor (yes)", "parity (birth before)", "maternal age", "maternal BMI", "maternal hypertension (yes)", "maternal diabetes (yes)", "maternal mental disorders (yes)", "maternal smoking (yes)", "maternal alcohol use (yes)"))+
  geom_vline(xintercept=0, linetype="dashed")+
  theme_bw()+
  ggtitle("nzero = 7")+
  theme(text = element_text(size = 17), axis.title.x= element_text(size=15), axis.title.y= element_text(size=15), plot.title = element_text(size=15), axis.text.y=element_blank())

g1 <- ggplotGrob(p1)
g2 <- ggplotGrob(p2)
g <- cbind(g1, g2, size = "last")
g$heights <- unit.pmax(g1$heights, g2$heights)

png(filename="Results/Figures/elasticNet_singleTissues/Outcome_main/Model_coef_Placenta.png", width=5800, height=1600, res=400)
grid.draw(g)
dev.off()

to the top

Placenta elastic net

additional model, with alcohol variable

```r
# in case you want to start from here
load(\InputData/ClockCalculationsInput/Reg_Input_Data_Placenta_ITU_EAAR_noNa_wa.Rdata\)

<!-- rnb-source-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->




<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxueXJjX21hdF9JVFVfUGxhY2VudGFfd2EgPC0gbWF0cml4KFJlZ19JbnB1dF9EYXRhX1BsYWNlbnRhX0lUVV9FQUFSX25vTmFfd2EkRUFBUl9MZWUpXG54cmNfbWF0X0lUVV9QbGFjZW50YV93YSA8LSBtb2RlbC5tYXRyaXgoIH4gLiAtIEVBQVJfTGVlLCBkYXRhID0gUmVnX0lucHV0X0RhdGFfUGxhY2VudGFfSVRVX0VBQVJfbm9OYV93YSlbLCAtMV1cbnlyY19tYXRfSVRVX3NjYWxlZF9QbGFjZW50YV93YSA8LSBzY2FsZSh5cmNfbWF0X0lUVV9QbGFjZW50YV93YSlcbnhyY19tYXRfSVRVX3NjYWxlZF9QbGFjZW50YV93YSA8LSBzY2FsZSh4cmNfbWF0X0lUVV9QbGFjZW50YV93YSlcbmBgYFxuYGBgIn0= -->

```r
```r
yrc_mat_ITU_Placenta_wa <- matrix(Reg_Input_Data_Placenta_ITU_EAAR_noNa_wa$EAAR_Lee)
xrc_mat_ITU_Placenta_wa <- model.matrix( ~ . - EAAR_Lee, data = Reg_Input_Data_Placenta_ITU_EAAR_noNa_wa)[, -1]
yrc_mat_ITU_scaled_Placenta_wa <- scale(yrc_mat_ITU_Placenta_wa)
xrc_mat_ITU_scaled_Placenta_wa <- scale(xrc_mat_ITU_Placenta_wa)

<!-- rnb-source-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->


<!-- set seed -->
<!-- ```{r} -->
<!-- set.seed(2020) -->
<!-- ``` -->


<!-- ```{r, warning=F} -->
<!--   nboot = 1000 -->

<!--   start_time <- Sys.time() -->
<!--   bootstraps_Placenta_ITU_wa <- replicate(nboot, { -->
<!--     rws <- sample(1:nrow(xrc_mat_ITU_scaled_Placenta_wa), replace = TRUE) -->
<!--     ensr(xrc_mat_ITU_scaled_Placenta_wa[rws, ], yrc_mat_ITU_scaled_Placenta_wa[rws, ], standardized = FALSE, family="gaussian", nlambda=100, nfolds=10, alpha=c(0.0,0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1.0)) -->
<!--   }, -->
<!--   simplify = FALSE) -->

<!--   end_time <- Sys.time() -->
<!--   end_time - start_time -->

<!--   #Time difference of 3.159319 hours -->

<!-- ``` -->

<!-- ```{r} -->
<!-- save(bootstraps_Placenta_ITU_wa, file="InputData/Data_ElasticNets/bootstraps_Placenta_ITU_wa_1000.Rdata") -->
<!-- ``` -->




<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxubG9hZChcXElucHV0RGF0YS9EYXRhX0VsYXN0aWNOZXRzL2Jvb3RzdHJhcHNfUGxhY2VudGFfSVRVX3dhXzEwMDAuUmRhdGFcXClcbmBgYFxuYGBgIn0= -->

```r
```r
load(\InputData/Data_ElasticNets/bootstraps_Placenta_ITU_wa_1000.Rdata\)

<!-- rnb-source-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->




<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuc3VtbWFyaWVzX1BsYWNlbnRhX0lUVV93YSA8LVxuICBib290c3RyYXBzX1BsYWNlbnRhX0lUVV93YSAlPiVcbiAgbGFwcGx5KHN1bW1hcnkpICU+JVxuICByYmluZGxpc3QoaWRjb2wgPSBcImJvb3RzdHJhcFwiKVxuXG5zdW1tYXJpZXNfUGxhY2VudGFfSVRVX3dhXG5gYGAifQ== -->

```r
summaries_Placenta_ITU_wa <-
  bootstraps_Placenta_ITU_wa %>%
  lapply(summary) %>%
  rbindlist(idcol = "bootstrap")

summaries_Placenta_ITU_wa
summaries_Placenta_ITU_wa[, .SD[cvm == min(cvm)], by = c("bootstrap", "nzero")] %>%
  ggplot2::ggplot(data = .) +
  ggplot2::aes(x = nzero, y = cvm, group = bootstrap) +
  ggplot2::geom_point() +
  ggplot2::geom_line()
png(filename="Results/Figures/elasticNet_singleTissues/Outcome_add/alcohol/bootstraps_Placenta.png", width=800, height=600)
summaries_Placenta_ITU_wa[, .SD[cvm == min(cvm)], by = c("bootstrap", "nzero")] %>%
  ggplot2::ggplot(data = .) +
  ggplot2::aes(x = nzero, y = cvm, group = bootstrap) +
  ggplot2::geom_point() +
  ggplot2::geom_line()
dev.off()
```r
load(\InputData/Data_ElasticNets/pm2_Placenta_ITU_wa.Rdata\)
# coefficient values for the models with smallest cvm by number of non-erzo coefficients and bootstrap

<!-- rnb-source-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->




<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuY3N1bW1hcnlfUGxhY2VudGFfSVRVX3dhIDwtIFJlZHVjZShmdW5jdGlvbih4LHkpIG1lcmdlKHggPSB4LCB5ID0geSwgYnkgPSBcIm56ZXJvXCIpLCBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0KHBtMl9QbGFjZW50YV9JVFVfd2FbLCBsYXBwbHkoLlNELCBmdW5jdGlvbih4KSB7bWVhbih4ICE9IDApfSksIC5TRGNvbHMgPSBjKFwiQ2hpbGRfU2V4ZmVtYWxlXCIsIFwiQ2hpbGRfQmlydGhfV2VpZ2h0XCIsIFwiQ2hpbGRfQmlydGhfTGVuZ3RoXCIsIFwiQ2hpbGRfSGVhZF9DaXJjdW1mZXJlbmNlX0F0X0JpcnRoXCIsIFwiRGVsaXZlcnlfbW9kZV9kaWNob3RvbWFpZGVkXCIsIFwiSW5kdWNlZF9MYWJvdXJ5ZXNcIiwgXCJQYXJpdHlfZGljaG90b21naXZlbiBiaXJ0aCBiZWZvcmVcIiwgXCJNYXRlcm5hbF9BZ2VfWWVhcnNcIiwgXCJNYXRlcm5hbF9Cb2R5X01hc3NfSW5kZXhfaW5fRWFybHlfUHJlZ25hbmN5XCIsIFwiTWF0ZXJuYWxfSHlwZXJ0ZW5zaW9uX2RpY2hvdG9taHlwZXJ0ZW5zaW9uIGluIGN1cnJlbnQgcHJlZ25hbmN5XCIsIFwiTWF0ZXJuYWxfRGlhYmV0ZXNfZGljaG90b21kaWFiZXRlcyBpbiBjdXJyZW50IHByZWduYW5jeVwiLCBcIk1hdGVybmFsX01lbnRhbF9EaXNvcmRlcnNZZXNcIiwgXCJzbW9raW5nX2RpY2hvdG9teWVzXCIsIFwibWF0ZXJuYWxfYWxjb2hvbF91c2V5ZXNcIiksIGJ5ID0gbnplcm9dXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbTJfUGxhY2VudGFfSVRVX3dhWywgLihtZWFuX2N2bSA9IG1lYW4oY3ZtKSksIGJ5ID0gbnplcm9dLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG0yX1BsYWNlbnRhX0lUVV93YVssIC4obWVkaWFuX2N2bSA9IG1lZGlhbihjdm0pKSwgYnkgPSBuemVyb11cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApKVtvcmRlcihuemVybyldXG5cbmNzdW1tYXJ5X1BsYWNlbnRhX0lUVV93YVxuYGBgIn0= -->

```r
csummary_Placenta_ITU_wa <- Reduce(function(x,y) merge(x = x, y = y, by = "nzero"), 
                                  list(pm2_Placenta_ITU_wa[, lapply(.SD, function(x) {mean(x != 0)}), .SDcols = c("Child_Sexfemale", "Child_Birth_Weight", "Child_Birth_Length", "Child_Head_Circumference_At_Birth", "Delivery_mode_dichotomaided", "Induced_Labouryes", "Parity_dichotomgiven birth before", "Maternal_Age_Years", "Maternal_Body_Mass_Index_in_Early_Pregnancy", "Maternal_Hypertension_dichotomhypertension in current pregnancy", "Maternal_Diabetes_dichotomdiabetes in current pregnancy", "Maternal_Mental_DisordersYes", "smoking_dichotomyes", "maternal_alcohol_useyes"), by = nzero]
                                       ,
                                       pm2_Placenta_ITU_wa[, .(mean_cvm = mean(cvm)), by = nzero],
                                       pm2_Placenta_ITU_wa[, .(median_cvm = median(cvm)), by = nzero]
                                  ))[order(nzero)]

csummary_Placenta_ITU_wa
g1_Placenta_ITU_wa <-
  csummary_Placenta_ITU_wa %>%
  melt(id.vars = c("nzero", "mean_cvm", "median_cvm")) %>%
  ggplot2::ggplot(.) +
  ggplot2::theme_bw() +
  ggplot2::aes(x = nzero) +
  ggplot2::geom_point(mapping = ggplot2::aes(y = variable, size = value, alpha = value, color = value*100)) +
  ggplot2::scale_color_gradient2(high = 'green', mid = "purple", low = "black", midpoint =50)+
  ggplot2::scale_alpha(guide = 'none')+
  ggplot2::scale_size(guide = 'none')+
  ggplot2::scale_y_discrete(labels= c("child sex", "birth weight", "birth length", "head circumference", "delivery mode", "induced labor", "parity", "maternal age", "maternal BMI", "maternal hypertension", "maternal diabetes", "maternal mental disorders", "maternal smoking", "maternal alcohol use"))+
  ggplot2::scale_x_continuous(breaks=0:14, labels=)+
  ggplot2::labs(y="predictor", x = "number of non-zero coefficients", color="%")+
  ggplot2::theme(text = element_text(size = 15), axis.title.x= element_text(size=15), axis.title.y= element_text(size=15))

g2_Placenta_ITU_wa <-
  csummary_Placenta_ITU_wa %>%
  ggplot2::ggplot(.) +
  ggplot2::theme_bw() +
  ggplot2::aes(x = nzero, y = median_cvm) +
  ggplot2::geom_point() + ggplot2::geom_line()+
  ggplot2::labs(y="median cvm", x = "number of non-zero coefficients")+
  ggplot2::scale_x_continuous(breaks=0:14, labels=)+
  ggplot2::theme(axis.text=element_text(size=15),axis.title=element_text(size=18))

gridExtra::grid.arrange(g1_Placenta_ITU_wa, g2_Placenta_ITU_wa, ncol = 1)
png(filename="Results/Figures/elasticNet_singleTissues/Outcome_add/alcohol/bootstrapModels_Placenta.png", width=2400, height=1800, res=300)
gridExtra::grid.arrange(g1_Placenta_ITU_wa, g2_Placenta_ITU_wa, ncol = 1)
dev.off()
png(filename="Results/Figures/elasticNet_singleTissues/Outcome_add/alcohol/Model_Placenta.png", width=2800, height=1400, res=400)
g1_Placenta_ITU_wa
dev.off()
elbow_finder(csummary_Placenta_ITU_wa$nzero, csummary_Placenta_ITU_wa$median_cvm)

nzero_indices_Placenta <- data.frame(t(elbow_finder(csummary_Placenta_ITU_wa$nzero, csummary_Placenta_ITU_wa$median_cvm)))
colnames(nzero_indices_Placenta) <- c("x", "y")
rownames(nzero_indices_Placenta) <- NULL
```r
nzero_final_itu_placenta_wa <- 6

<!-- rnb-source-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->



<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuY3N1bW1hcnlfUGxhY2VudGFfSVRVX3dhW256ZXJvICVpbiUgbnplcm9fZmluYWxfaXR1X3BsYWNlbnRhX3dhXVxuYGBgIn0= -->

```r
csummary_Placenta_ITU_wa[nzero %in% nzero_final_itu_placenta_wa]
nonzero_choose_Placenta <- ggplot2::ggplot(csummary_Placenta_ITU_wa) +
  ggplot2::theme_bw()+
  ggplot2::aes(x = nzero, y = median_cvm) +
  ggplot2::scale_x_continuous(breaks=c(0:17))+
  ggplot2::geom_point() + ggplot2::geom_line()+
  ggplot2::geom_point(data=nzero_indices_Placenta, aes(x=x, y=y), colour="red", size=2)+
  ggplot2::ylab("median of minimum cross-validation errors over bootstraps")+
  ggplot2::xlab("number of non-zero coefficients")+
  ggplot2::geom_segment(aes(x = nzero[1], y = median_cvm[1], xend = nzero[15], yend = median_cvm[15], colour = "segment"), data = csummary_Placenta_ITU_wa, show.legend = F)

nonzero_choose_Placenta
png(filename="Results/Figures/elasticNet_singleTissues/Outcome_add/alcohol/nzero_choose_Placenta.png", width=1600, height=1400, res=300)
nonzero_choose_Placenta
dev.off()
```r
summary_Placenta_ITU_wa_finalnzero <- csummary_Placenta_ITU_wa[nzero %in% nzero_final_itu_placenta_wa]
sig_var_names_Placenta_ITU_wa_finalnzero <- Filter(function(x) any(x > 0.75), summary_Placenta_ITU_wa_finalnzero[,!c(\nzero\, \mean_cvm\, \median_cvm\)]) %>% colnames()
colnames(summary_Placenta_ITU_wa_finalnzero) <- c(\non-zero\, \child sex (female)\, \birth weight\, \birth length\, \head circumference\, \delivery mode (aided)\, \induced labor (yes)\, \parity (birth before)\, \maternal age\, \maternal BMI\, \maternal hypertension (yes)\, \maternal diabetes (yes)\, \maternal mental disorders (yes)\, \maternal smoking (yes)\, \maternal alcohol use (yes)\, \mean cvm\, \median cvm\)
summary_Placenta_ITU_wa_finalnzeroT <- as.data.frame(t(summary_Placenta_ITU_wa_finalnzero[,-c(\non-zero\, \median cvm\, \mean cvm\)]))
summary_Placenta_ITU_wa_finalnzeroT$variable <- rownames(summary_Placenta_ITU_wa_finalnzeroT)
rownames(summary_Placenta_ITU_wa_finalnzeroT) <- NULL
names(summary_Placenta_ITU_wa_finalnzeroT)[names(summary_Placenta_ITU_wa_finalnzeroT) == 'V1'] <- 'percent'
summary_Placenta_ITU_wa_finalzeroT <- summary_Placenta_ITU_wa_finalnzeroT[order(summary_Placenta_ITU_wa_finalnzeroT$percent),]

summary_Placenta_ITU_wa_finalnzeroT$number <- seq(1, length(summary_Placenta_ITU_wa_finalnzeroT$variable))

<!-- rnb-source-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->



<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxucGVyY192YXJzX1BsYWNlbnRhX0lUVV93YSA8LSBcbiAgZ2dwbG90KHN1bW1hcnlfUGxhY2VudGFfSVRVX3dhX2ZpbmFsbnplcm9ULCBhZXMocmVvcmRlcih2YXJpYWJsZSwgcGVyY2VudCksIHBlcmNlbnQsIGdyb3VwPTEpKStcbiAgZ2VvbV9wb2ludCgpKyBnZW9tX2xpbmUoKStcbiAgeWxhYihcIiUgb2NjdXJlbmNlIGluIG1vZGVscyB3aXRoIG56ZXJvIGNvZWZmaWNpZW50cyA9IDhcIikrXG4gIHNjYWxlX3lfY29udGludW91cyhicmVha3M9YygwLjEsMC4yLDAuMywwLjQsMC41LDAuNiwwLjcsMC44LDAuOSkpK1xuICB4bGFiKFwidmFyaWFibGVcIikrXG4gIGNvb3JkX2ZsaXAoKStcbiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0PTAuNzUsIGxpbmV0eXBlPVwiZG90dGVkXCIpK1xuICB0aGVtZV9idygpXG5cbnBlcmNfdmFyc19QbGFjZW50YV9JVFVfd2FcblxuIyBkZWNpZGUgZm9yIGN1dC1vZmYgJSAtPiBoZXJlIC43NVxuXG5GaWx0ZXIoZnVuY3Rpb24oeCkgYW55KHggPiAwLjc1KSwgc3VtbWFyeV9QbGFjZW50YV9JVFVfd2FfZmluYWxuemVyb1ssIWMoXCJub24temVyb1wiLCBcIm1lYW4gY3ZtXCIsIFwibWVkaWFuIGN2bVwiKV0pXG5cbmBgYCJ9 -->

```r
perc_vars_Placenta_ITU_wa <- 
  ggplot(summary_Placenta_ITU_wa_finalnzeroT, aes(reorder(variable, percent), percent, group=1))+
  geom_point()+ geom_line()+
  ylab("% occurence in models with nzero coefficients = 8")+
  scale_y_continuous(breaks=c(0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9))+
  xlab("variable")+
  coord_flip()+
  geom_hline(yintercept=0.75, linetype="dotted")+
  theme_bw()

perc_vars_Placenta_ITU_wa

# decide for cut-off % -> here .75

Filter(function(x) any(x > 0.75), summary_Placenta_ITU_wa_finalnzero[,!c("non-zero", "mean cvm", "median cvm")])
png(filename="Results/Figures/elasticNet_singleTissues/Outcome_add/alcohol/varsPercent_Placenta.png", width=1100, height=1400, res=300)
perc_vars_Placenta_ITU_wa
dev.off()
```r
pm2_Placenta_ITU_wa_coef <-
  dcast(pm2_Placenta_ITU_wa[,
                        as.list(unlist(
                          lapply(.SD,
                                 function(x) {
                                   y <- unname(quantile(x[x != 0], probs = c(0.025, 0.975)))
                                   list(\non_zero\ = 100 * mean(x != 0),
                                        lcl = y[1],
                                        ucl = y[2],
                                        width = diff(y),
                                        median = median(x[x!= 0]))
                                 }))),
                        .SDcols = c(\Child_Sexfemale\, \Child_Birth_Weight\, \Child_Birth_Length\, \Child_Head_Circumference_At_Birth\, \Delivery_mode_dichotomaided\, \Induced_Labouryes\, \Parity_dichotomgiven birth before\, \Maternal_Age_Years\, \Maternal_Body_Mass_Index_in_Early_Pregnancy\, \Maternal_Hypertension_dichotomhypertension in current pregnancy\, \Maternal_Diabetes_dichotomdiabetes in current pregnancy\, \Maternal_Mental_DisordersYes\, \smoking_dichotomyes\, \maternal_alcohol_useyes\),
                        by = nzero][order(nzero)] %>%
          melt(id.var = \nzero\) %>%
          .[, metric := sub(\^.+\\.(.+)$\, \\\1\, variable)] %>%
          .[, variable := sub(\^(.+)\\..+$\, \\\1\, variable)] %>%
          .[nzero == nzero_final_itu_placenta_wa], nzero+ variable ~ metric, value.var=\value\)

# get desired order of predictors
pm2_Placenta_ITU_wa_coef <-
  pm2_Placenta_ITU_wa_coef[match(c(\Child_Sexfemale\, \Child_Birth_Weight\, \Child_Birth_Length\, \Child_Head_Circumference_At_Birth\, \Delivery_mode_dichotomaided\, \Induced_Labouryes\, \Parity_dichotomgiven birth before\, \Maternal_Age_Years\, \Maternal_Body_Mass_Index_in_Early_Pregnancy\, \Maternal_Hypertension_dichotomhypertension in current pregnancy\, \Maternal_Diabetes_dichotomdiabetes in current pregnancy\, \Maternal_Mental_DisordersYes\, \smoking_dichotomyes\, \maternal_alcohol_useyes\), pm2_Placenta_ITU_wa_coef$variable),]
pm2_Placenta_ITU_wa_coef$variable <- factor(pm2_Placenta_ITU_wa_coef$variabl, levels=unique(pm2_Placenta_ITU_wa_coef$variable))

<!-- rnb-source-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->



<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxuc2lnX3ZhcnNfUGxhY2VudGFfSVRVX3dhIDwtXG4gIHBtMl9QbGFjZW50YV9JVFVfd2FfY29lZiAlPiVcbiAgZ2dwbG90Mjo6Z2dwbG90KC4pICtcbiAgZ2dwbG90Mjo6dGhlbWVfYncoKSArXG4gIGdncGxvdDI6OnRoZW1lKGF4aXMudGV4dC54PWVsZW1lbnRfYmxhbmsoKSkrXG4gIGdncGxvdDI6OmFlcyh4PVxcbnplcm9cXCkrXG4gIGdncGxvdDI6Omdlb21fcG9pbnQobWFwcGluZyA9IGdncGxvdDI6OmFlcyh5ID0gdmFyaWFibGUsIHNpemUgPW5vbl96ZXJvLCBhbHBoYSA9IG5vbl96ZXJvLCBjb2xvciA9IG5vbl96ZXJvKSkgK1xuICBnZ3Bsb3QyOjpnZW9tX3RleHQoYWVzKHk9dmFyaWFibGUsIGxhYmVsPXNwcmludGYoXFwlMC4yZlxcLCByb3VuZChtZWRpYW4sIGRpZ2l0cz0yKSksIHNpemU9NTApLGhqdXN0PTAsIHZqdXN0PTAuNSwgbnVkZ2VfeCA9IDAuMSkrXG4gIGdncGxvdDI6OnNjYWxlX2NvbG9yX2dyYWRpZW50MihoaWdoID0gJ2dyZWVuJywgbWlkID0gXFxwdXJwbGVcXCwgbG93ID0gXFxibGFja1xcLCBtaWRwb2ludCA9NTApK1xuICBnZ3Bsb3QyOjpzY2FsZV9hbHBoYShndWlkZSA9ICdub25lJykrXG4gIGdncGxvdDI6OnNjYWxlX3NpemUoZ3VpZGUgPSAnbm9uZScpK1xuICBnZ3Bsb3QyOjpzY2FsZV95X2Rpc2NyZXRlKGxhYmVscz0gYyhcXGNoaWxkIHNleCAoZmVtYWxlKVxcLCBcXGJpcnRoIHdlaWdodFxcLCBcXGJpcnRoIGxlbmd0aFxcLCBcXGhlYWQgY2lyY3VtZmVyZW5jZVxcLCBcXGRlbGl2ZXJ5IG1vZGUgKGFpZGVkKVxcLCBcXGluZHVjZWQgbGFib3IgKHllcylcXCwgXFxwYXJpdHkgKGJpcnRoIGJlZm9yZSlcXCwgXFxtYXRlcm5hbCBhZ2VcXCwgXFxtYXRlcm5hbCBCTUlcXCwgXFxtYXRlcm5hbCBoeXBlcnRlbnNpb24gKHllcylcXCwgXFxtYXRlcm5hbCBkaWFiZXRlcyAoeWVzKVxcLCBcXG1hdGVybmFsIG1lbnRhbCBkaXNvcmRlcnMgKHllcylcXCwgXFxtYXRlcm5hbCBzbW9raW5nICh5ZXMpXFwsIFxcbWF0ZXJuYWwgYWxjb2hvbCB1c2UgKHllcylcXCkpK1xuICBnZ3Bsb3QyOjpsYWJzKHk9XFxwcmVkaWN0b3JcXCwgeCA9IFxcbnVtYmVyIG9mIG5vbi16ZXJvIGNvZWZmaWNpZW50cyA9IDdcXCwgY29sb3I9XFwlXFwpXG5cbmBgYFxuYGBgIn0= -->

```r
```r
sig_vars_Placenta_ITU_wa <-
  pm2_Placenta_ITU_wa_coef %>%
  ggplot2::ggplot(.) +
  ggplot2::theme_bw() +
  ggplot2::theme(axis.text.x=element_blank())+
  ggplot2::aes(x=\nzero\)+
  ggplot2::geom_point(mapping = ggplot2::aes(y = variable, size =non_zero, alpha = non_zero, color = non_zero)) +
  ggplot2::geom_text(aes(y=variable, label=sprintf(\%0.2f\, round(median, digits=2)), size=50),hjust=0, vjust=0.5, nudge_x = 0.1)+
  ggplot2::scale_color_gradient2(high = 'green', mid = \purple\, low = \black\, midpoint =50)+
  ggplot2::scale_alpha(guide = 'none')+
  ggplot2::scale_size(guide = 'none')+
  ggplot2::scale_y_discrete(labels= c(\child sex (female)\, \birth weight\, \birth length\, \head circumference\, \delivery mode (aided)\, \induced labor (yes)\, \parity (birth before)\, \maternal age\, \maternal BMI\, \maternal hypertension (yes)\, \maternal diabetes (yes)\, \maternal mental disorders (yes)\, \maternal smoking (yes)\, \maternal alcohol use (yes)\))+
  ggplot2::labs(y=\predictor\, x = \number of non-zero coefficients = 7\, color=\%\)

<!-- rnb-source-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->



<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuY29lZl9QbGFjZW50YV9JVFVfd2EgPC0gXG4gIGdncGxvdChwbTJfUGxhY2VudGFfSVRVX3dhX2NvZWYsIGFlcyh5ID0gdmFyaWFibGUsIHg9bWVkaWFuKSkrXG4gIGdlb21fcG9pbnQobWFwcGluZyA9IGdncGxvdDI6OmFlcyh5ID0gdmFyaWFibGUsIHNpemUgPW5vbl96ZXJvLCBhbHBoYSA9IG5vbl96ZXJvLCBjb2xvciA9IG5vbl96ZXJvKSkrXG4gIHNjYWxlX2NvbG9yX2dyYWRpZW50MihoaWdoID0gJ2dyZWVuJywgbWlkID0gXCJwdXJwbGVcIiwgbG93ID0gXCJibGFja1wiLCBtaWRwb2ludCA9NTAsIGxpbWl0cz1jKDAsMTAwKSkrXG4gIHNjYWxlX2FscGhhKGd1aWRlID0gJ25vbmUnKStcbiAgc2NhbGVfc2l6ZShndWlkZSA9ICdub25lJykrXG4gIGdlb21fcG9pbnQoKStcbiAgZ2VvbV9lcnJvcmJhcihhZXMoeSA9IHZhcmlhYmxlLCB4bWluID0gbGNsLCB4bWF4ID0gdWNsKSwgd2lkdGggPSAwLjIpK1xuICBsYWJzKHk9XCJwcmVkaWN0b3JcIiwgeCA9IFwiXFxubWVkaWFuICYgOTUlIENJIG9mIGNvZWZmaWNpZW50IChvdmVyIGJvb3RzdHJhcHMpXCIsIGNvbG9yPVwiJVwiKStcbiAgc2NhbGVfeF9jb250aW51b3VzKGxpbWl0cz1jKC0wLjQsMC40KSwgYnJlYWtzPWMoLS40LC0uMywtLjIsIC0uMSwgMCwgLjEsIC4yLCAuMywgLjQpKStcbiAgc2NhbGVfeV9kaXNjcmV0ZShsYWJlbHM9IGMoXCJjaGlsZCBzZXggKGZlbWFsZSlcIiwgXCJiaXJ0aCB3ZWlnaHRcIiwgXCJiaXJ0aCBsZW5ndGhcIiwgXCJoZWFkIGNpcmN1bWZlcmVuY2VcIiwgXCJkZWxpdmVyeSBtb2RlIChhaWRlZClcIiwgXCJpbmR1Y2VkIGxhYm9yICh5ZXMpXCIsIFwicGFyaXR5IChiaXJ0aCBiZWZvcmUpXCIsIFwibWF0ZXJuYWwgYWdlXCIsIFwibWF0ZXJuYWwgQk1JXCIsIFwibWF0ZXJuYWwgaHlwZXJ0ZW5zaW9uICh5ZXMpXCIsIFwibWF0ZXJuYWwgZGlhYmV0ZXMgKHllcylcIiwgXCJtYXRlcm5hbCBtZW50YWwgZGlzb3JkZXJzICh5ZXMpXCIsIFwibWF0ZXJuYWwgc21va2luZyAoeWVzKVwiLCBcIm1hdGVybmFsIGFsY29ob2wgdXNlICh5ZXMpXCIpKStcbiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0PTAsIGxpbmV0eXBlPVwiZGFzaGVkXCIpK1xuICB0aGVtZV9idygpK1xuICB0aGVtZSh0ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNSksIGF4aXMudGl0bGUueD0gZWxlbWVudF90ZXh0KHNpemU9MTUpLCBheGlzLnRpdGxlLnk9IGVsZW1lbnRfdGV4dChzaXplPTE1KSlcblxuXG5jb2VmX1BsYWNlbnRhX0lUVV93YSBcbmBgYCJ9 -->

```r
coef_Placenta_ITU_wa <- 
  ggplot(pm2_Placenta_ITU_wa_coef, aes(y = variable, x=median))+
  geom_point(mapping = ggplot2::aes(y = variable, size =non_zero, alpha = non_zero, color = non_zero))+
  scale_color_gradient2(high = 'green', mid = "purple", low = "black", midpoint =50, limits=c(0,100))+
  scale_alpha(guide = 'none')+
  scale_size(guide = 'none')+
  geom_point()+
  geom_errorbar(aes(y = variable, xmin = lcl, xmax = ucl), width = 0.2)+
  labs(y="predictor", x = "\nmedian & 95% CI of coefficient (over bootstraps)", color="%")+
  scale_x_continuous(limits=c(-0.4,0.4), breaks=c(-.4,-.3,-.2, -.1, 0, .1, .2, .3, .4))+
  scale_y_discrete(labels= c("child sex (female)", "birth weight", "birth length", "head circumference", "delivery mode (aided)", "induced labor (yes)", "parity (birth before)", "maternal age", "maternal BMI", "maternal hypertension (yes)", "maternal diabetes (yes)", "maternal mental disorders (yes)", "maternal smoking (yes)", "maternal alcohol use (yes)"))+
  geom_vline(xintercept=0, linetype="dashed")+
  theme_bw()+
  theme(text = element_text(size = 15), axis.title.x= element_text(size=15), axis.title.y= element_text(size=15))


coef_Placenta_ITU_wa 
png(filename="Results/Figures/elasticNet_singleTissues/Outcome_add/alcohol/coef_Placenta.png", width=2800, height=1400, res=400)
coef_Placenta_ITU_wa
dev.off()
p1 <-
   csummary_Placenta_ITU_wa %>%
  melt(id.vars = c("nzero", "mean_cvm", "median_cvm")) %>%
  ggplot2::ggplot(.) +
  ggplot2::theme_bw() +
  ggplot2::aes(x = nzero) +
  ggplot2::geom_point(mapping = ggplot2::aes(y = variable, size = value, alpha = value, color = value*100)) +
  ggplot2::scale_color_gradient2(high = 'green', mid = "purple", low = "black", midpoint =50)+
  ggplot2::scale_alpha(guide = 'none')+
  ggplot2::scale_size(guide = 'none')+
  ggplot2::scale_y_discrete(labels= c("child sex (female)", "birth weight", "birth length", "head circumference", "delivery mode (aided)", "induced labor (yes)", "parity (birth before)", "maternal age", "maternal BMI", "maternal hypertension (yes)", "maternal diabetes (yes)", "maternal mental disorders (yes)", "maternal smoking (yes)", "maternal alcohol use (yes)"))+
  ggplot2::scale_x_continuous(breaks=0:14, labels=)+
  ggplot2::labs(y="predictor", x = "\nnumber of non-zero coefficients", color="%")+
  ggplot2::theme(text = element_text(size = 17), axis.title.x= element_text(size=15), axis.title.y= element_text(size=15), legend.position = "none")
  
p2 <- 
  ggplot(pm2_Placenta_ITU_wa_coef, aes(y = variable, x=median))+
  geom_point(mapping = ggplot2::aes(y = variable, size =non_zero, alpha = non_zero, color = non_zero))+
  scale_color_gradient2(high = 'green', mid = "purple", low = "black", midpoint =50, limits=c(0,100))+
  scale_alpha(guide = 'none')+
  scale_size(guide = 'none')+
  geom_point()+
  geom_errorbar(aes(y = variable, xmin = lcl, xmax = ucl), width = 0.2)+
  labs(y="", x = "\nmedian & 95% CI of coefficient (over bootstraps)", color="%")+
  scale_x_continuous(limits=c(-0.4,0.4), breaks=c(-.4,-.3,-.2, -.1, 0, .1, .2, .3, .4))+
  scale_y_discrete(labels= c("child sex (female)", "birth weight", "birth length", "head circumference", "delivery mode (aided)", "induced labor (yes)", "parity (birth before)", "maternal age", "maternal BMI", "maternal hypertension (yes)", "maternal diabetes (yes)", "maternal mental disorders (yes)", "maternal smoking (yes)", "maternal alcohol use (yes)"))+
  geom_vline(xintercept=0, linetype="dashed")+
  theme_bw()+
  ggtitle("nzero = 6")+
  theme(text = element_text(size = 17), axis.title.x= element_text(size=15), axis.title.y= element_text(size=15), plot.title = element_text(size=15), axis.text.y=element_blank())

g1 <- ggplotGrob(p1)
g2 <- ggplotGrob(p2)
g <- cbind(g1, g2, size = "last")
g$heights <- unit.pmax(g1$heights, g2$heights)

png(filename="Results/Figures/elasticNet_singleTissues/Outcome_add/alcohol/Model_coef_Placenta.png", width=5800, height=1600, res=400)
grid.draw(g)
dev.off()

to the top

Placenta elastic net splitted by sex

model without alcohol variable, but splitted by sex

males

```r
# in case you want to start from here
load(\InputData/ClockCalculationsInput/Reg_Input_Data_Placenta_male_ITU_EAAR_noNa_n.Rdata\)
Reg_Input_Data_Placenta_male_ITU_EAAR_noNa_n$Child_Sex <- NULL

<!-- rnb-source-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->




<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxueXJjX21hdF9JVFVfUGxhY2VudGFfbWFsZV9uIDwtIG1hdHJpeChSZWdfSW5wdXRfRGF0YV9QbGFjZW50YV9tYWxlX0lUVV9FQUFSX25vTmFfbiRFQUFSX0xlZSlcbnhyY19tYXRfSVRVX1BsYWNlbnRhX21hbGVfbiA8LSBtb2RlbC5tYXRyaXgoIH4gLiAtIEVBQVJfTGVlLCBkYXRhID0gUmVnX0lucHV0X0RhdGFfUGxhY2VudGFfbWFsZV9JVFVfRUFBUl9ub05hX24pWywgLTFdXG55cmNfbWF0X0lUVV9zY2FsZWRfUGxhY2VudGFfbWFsZV9uIDwtIHNjYWxlKHlyY19tYXRfSVRVX1BsYWNlbnRhX21hbGVfbilcbnhyY19tYXRfSVRVX3NjYWxlZF9QbGFjZW50YV9tYWxlX24gPC0gc2NhbGUoeHJjX21hdF9JVFVfUGxhY2VudGFfbWFsZV9uKVxuYGBgXG5gYGAifQ== -->

```r
```r
yrc_mat_ITU_Placenta_male_n <- matrix(Reg_Input_Data_Placenta_male_ITU_EAAR_noNa_n$EAAR_Lee)
xrc_mat_ITU_Placenta_male_n <- model.matrix( ~ . - EAAR_Lee, data = Reg_Input_Data_Placenta_male_ITU_EAAR_noNa_n)[, -1]
yrc_mat_ITU_scaled_Placenta_male_n <- scale(yrc_mat_ITU_Placenta_male_n)
xrc_mat_ITU_scaled_Placenta_male_n <- scale(xrc_mat_ITU_Placenta_male_n)

<!-- rnb-source-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->


<!-- set seed -->
<!-- ```{r} -->
<!-- set.seed(2020) -->
<!-- ``` -->


<!-- ```{r, warning=F} -->
<!--   nboot = 1000 -->

<!--   start_time <- Sys.time() -->
<!--   bootstraps_Placenta_male_ITU_n <- replicate(nboot, { -->
<!--     rws <- sample(1:nrow(xrc_mat_ITU_scaled_Placenta_male_n), replace = TRUE) -->
<!--     ensr(xrc_mat_ITU_scaled_Placenta_male_n[rws, ], yrc_mat_ITU_scaled_Placenta_male_n[rws, ], standardized = FALSE, family="gaussian", nlambda=100, nfolds=10, alpha=c(0.0,0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1.0)) -->
<!--   }, -->
<!--   simplify = FALSE) -->

<!-- ``` -->

<!-- ```{r} -->
<!-- save(bootstraps_Placenta_male_ITU_n, file="InputData/Data_ElasticNets/bootstraps_Placenta_male_ITU_n_1000.Rdata") -->
<!-- ``` -->



<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxubG9hZChcXElucHV0RGF0YS9EYXRhX0VsYXN0aWNOZXRzL2Jvb3RzdHJhcHNfUGxhY2VudGFfbWFsZV9JVFVfbl8xMDAwLlJkYXRhXFwpXG5gYGBcbmBgYCJ9 -->

```r
```r
load(\InputData/Data_ElasticNets/bootstraps_Placenta_male_ITU_n_1000.Rdata\)

<!-- rnb-source-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->




<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuc3VtbWFyaWVzX1BsYWNlbnRhX21hbGVfSVRVX24gPC1cbiAgYm9vdHN0cmFwc19QbGFjZW50YV9tYWxlX0lUVV9uICU+JVxuICBsYXBwbHkoc3VtbWFyeSkgJT4lXG4gIHJiaW5kbGlzdChpZGNvbCA9IFwiYm9vdHN0cmFwXCIpXG5cbnN1bW1hcmllc19QbGFjZW50YV9tYWxlX0lUVV9uXG5gYGAifQ== -->

```r
summaries_Placenta_male_ITU_n <-
  bootstraps_Placenta_male_ITU_n %>%
  lapply(summary) %>%
  rbindlist(idcol = "bootstrap")

summaries_Placenta_male_ITU_n
summaries_Placenta_male_ITU_n[, .SD[cvm == min(cvm)], by = c("bootstrap", "nzero")] %>%
  ggplot2::ggplot(data = .) +
  ggplot2::aes(x = nzero, y = cvm, group = bootstrap) +
  ggplot2::geom_point() +
  ggplot2::geom_line()
```r
png(filename=\Results/Figures/elasticNet_singleTissues/Outcome_add/sex_split/bootstraps_Placenta_MALE.png\, width=800, height=600)
summaries_Placenta_male_ITU_n[, .SD[cvm == min(cvm)], by = c(\bootstrap\, \nzero\)] %>%
  ggplot2::ggplot(data = .) +
  ggplot2::aes(x = nzero, y = cvm, group = bootstrap) +
  ggplot2::geom_point() +
  ggplot2::geom_line()
dev.off()

<!-- rnb-source-end -->

<!-- rnb-output-begin eyJkYXRhIjoibnVsbCBkZXZpY2UgXG4gICAgICAgICAgMSBcbiJ9 -->

null device 1




<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->



<!-- ```{r, warning=FALSE} -->
<!-- # lowest cvm by bootstrap and nzero -->
<!-- pm_Placenta_male_ITU_n <- summaries_Placenta_male_ITU_n[, .SD[cvm == min(cvm)], by = c("bootstrap", "nzero")] -->
<!-- pm2_Placenta_male_ITU_n <- NULL -->

<!-- for(i in as.integer(seq(1, nrow(pm_Placenta_male_ITU_n), by = 1))) { -->
<!--   pm2_Placenta_male_ITU_n <- rbind(pm2_Placenta_male_ITU_n, -->
<!--                cbind(pm_Placenta_male_ITU_n[i, ], -->
<!--                t(as.matrix(coef(bootstraps_Placenta_male_ITU_n[[pm_Placenta_male_ITU_n[i, bootstrap]]][[pm_Placenta_male_ITU_n[i, l_index]]], s = pm_Placenta_male_ITU_n[i, lambda]))) -->
<!--                ) -->
<!--   ) -->
<!-- } -->

<!-- pm2_Placenta_male_ITU_n -->
<!-- ``` -->


<!-- ```{r} -->
<!-- # save "preferable models" -->
<!-- save(pm2_Placenta_male_ITU_n, file="InputData/Data_ElasticNets/pm2_Placenta_male_ITU_n.Rdata") -->
<!-- ``` -->



<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxubG9hZChcXElucHV0RGF0YS9EYXRhX0VsYXN0aWNOZXRzL3BtMl9QbGFjZW50YV9tYWxlX0lUVV9uLlJkYXRhXFwpXG4jIGNvZWZmaWNpZW50IHZhbHVlcyBmb3IgdGhlIG1vZGVscyB3aXRoIHNtYWxsZXN0IGN2bSBieSBudW1iZXIgb2Ygbm9uLWVyem8gY29lZmZpY2llbnRzIGFuZCBib290c3RyYXBcbmBgYFxuYGBgIn0= -->

```r
```r
load(\InputData/Data_ElasticNets/pm2_Placenta_male_ITU_n.Rdata\)
# coefficient values for the models with smallest cvm by number of non-erzo coefficients and bootstrap

<!-- rnb-source-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->




<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuY3N1bW1hcnlfUGxhY2VudGFfbWFsZV9JVFVfbiA8LSBSZWR1Y2UoZnVuY3Rpb24oeCx5KSBtZXJnZSh4ID0geCwgeSA9IHksIGJ5ID0gXCJuemVyb1wiKSwgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0KHBtMl9QbGFjZW50YV9tYWxlX0lUVV9uWywgbGFwcGx5KC5TRCwgZnVuY3Rpb24oeCkge21lYW4oeCAhPSAwKX0pLCAuU0Rjb2xzID0gYyhcIkNoaWxkX0JpcnRoX1dlaWdodFwiLCBcIkNoaWxkX0JpcnRoX0xlbmd0aFwiLCBcIkNoaWxkX0hlYWRfQ2lyY3VtZmVyZW5jZV9BdF9CaXJ0aFwiLCBcIkRlbGl2ZXJ5X21vZGVfZGljaG90b21haWRlZFwiLCBcIkluZHVjZWRfTGFib3VyeWVzXCIsIFwiUGFyaXR5X2RpY2hvdG9tZ2l2ZW4gYmlydGggYmVmb3JlXCIsIFwiTWF0ZXJuYWxfQWdlX1llYXJzXCIsIFwiTWF0ZXJuYWxfQm9keV9NYXNzX0luZGV4X2luX0Vhcmx5X1ByZWduYW5jeVwiLCBcIk1hdGVybmFsX0h5cGVydGVuc2lvbl9kaWNob3RvbWh5cGVydGVuc2lvbiBpbiBjdXJyZW50IHByZWduYW5jeVwiLCBcIk1hdGVybmFsX0RpYWJldGVzX2RpY2hvdG9tZGlhYmV0ZXMgaW4gY3VycmVudCBwcmVnbmFuY3lcIiwgXCJNYXRlcm5hbF9NZW50YWxfRGlzb3JkZXJzWWVzXCIsIFwic21va2luZ19kaWNob3RvbXllc1wiKSwgYnkgPSBuemVyb11cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbTJfUGxhY2VudGFfbWFsZV9JVFVfblssIC4obWVhbl9jdm0gPSBtZWFuKGN2bSkpLCBieSA9IG56ZXJvXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG0yX1BsYWNlbnRhX21hbGVfSVRVX25bLCAuKG1lZGlhbl9jdm0gPSBtZWRpYW4oY3ZtKSksIGJ5ID0gbnplcm9dXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICApKVtvcmRlcihuemVybyldXG5cbmNzdW1tYXJ5X1BsYWNlbnRhX21hbGVfSVRVX25cbmBgYCJ9 -->

```r
csummary_Placenta_male_ITU_n <- Reduce(function(x,y) merge(x = x, y = y, by = "nzero"), 
                              list(pm2_Placenta_male_ITU_n[, lapply(.SD, function(x) {mean(x != 0)}), .SDcols = c("Child_Birth_Weight", "Child_Birth_Length", "Child_Head_Circumference_At_Birth", "Delivery_mode_dichotomaided", "Induced_Labouryes", "Parity_dichotomgiven birth before", "Maternal_Age_Years", "Maternal_Body_Mass_Index_in_Early_Pregnancy", "Maternal_Hypertension_dichotomhypertension in current pregnancy", "Maternal_Diabetes_dichotomdiabetes in current pregnancy", "Maternal_Mental_DisordersYes", "smoking_dichotomyes"), by = nzero]
                                   ,
                                   pm2_Placenta_male_ITU_n[, .(mean_cvm = mean(cvm)), by = nzero],
                                   pm2_Placenta_male_ITU_n[, .(median_cvm = median(cvm)), by = nzero]
                              ))[order(nzero)]

csummary_Placenta_male_ITU_n
g1_Placenta_male_ITU_n <-
  csummary_Placenta_male_ITU_n %>%
  melt(id.vars = c("nzero", "mean_cvm", "median_cvm")) %>%
  ggplot2::ggplot(.) +
  ggplot2::theme_bw() +
  ggplot2::aes(x = nzero) +
  ggplot2::geom_point(mapping = ggplot2::aes(y = variable, size = value, alpha = value, color = value*100)) +
  ggplot2::scale_color_gradient2(high = 'green', mid = "purple", low = "black", midpoint =50)+
  ggplot2::scale_alpha(guide = 'none')+
  ggplot2::scale_size(guide = 'none')+
  ggplot2::scale_y_discrete(labels= c("birth weight", "birth length", "head circumference", "delivery mode", "induced labor", "parity", "maternal age", "maternal BMI", "maternal hypertension", "maternal diabetes", "maternal mental disorders", "maternal smoking"))+
  ggplot2::scale_x_continuous(breaks=0:14, labels=)+
  ggplot2::labs(y="predictor", x = "number of non-zero coefficients", color="%")+
  ggplot2::theme(text = element_text(size = 15), axis.title.x= element_text(size=15), axis.title.y= element_text(size=15))

g2_Placenta_male_ITU_n <-
  csummary_Placenta_male_ITU_n %>%
  ggplot2::ggplot(.) +
  ggplot2::theme_bw() +
  ggplot2::aes(x = nzero, y = median_cvm) +
  ggplot2::geom_point() + ggplot2::geom_line()+
  ggplot2::labs(y="median cvm", x = "number of non-zero coefficients")+
  ggplot2::scale_x_continuous(breaks=0:14, labels=)+
  ggplot2::theme(axis.text=element_text(size=15),axis.title=element_text(size=18))


gridExtra::grid.arrange(g1_Placenta_male_ITU_n, g2_Placenta_male_ITU_n, ncol = 1)
png(filename="Results/Figures/elasticNet_singleTissues/Outcome_add/sex_split/bootstrapModels_Placenta_male.png", width=2400, height=1800, res=300)
gridExtra::grid.arrange(g1_Placenta_male_ITU_n, g2_Placenta_male_ITU_n, ncol = 1)
dev.off()
png(filename="Results/Figures/elasticNet_singleTissues/Outcome_add/sex_split/Model_Placenta_male.png", width=2800, height=1400, res=400)
g1_Placenta_male_ITU_n
dev.off()
elbow_finder(csummary_Placenta_male_ITU_n$nzero[-13], csummary_Placenta_male_ITU_n$median_cvm[-13])

nzero_indices_Cord <- data.frame(t(elbow_finder(csummary_Placenta_male_ITU_n$nzero[-13], csummary_Placenta_male_ITU_n$median_cvm[-13])))
colnames(nzero_indices_Cord) <- c("x", "y")
rownames(nzero_indices_Cord) <- NULL
```r
nzero_final_placenta_male <- 5

<!-- rnb-source-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->




<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuY3N1bW1hcnlfUGxhY2VudGFfbWFsZV9JVFVfbltuemVybyAlaW4lIG56ZXJvX2ZpbmFsX3BsYWNlbnRhX21hbGVdXG5gYGAifQ== -->

```r
csummary_Placenta_male_ITU_n[nzero %in% nzero_final_placenta_male]
```r
summary_Placenta_male_ITU_n_finalnzero <- csummary_Placenta_male_ITU_n[nzero %in% nzero_final_placenta_male]
sig_var_names_Placenta_male_ITU_n_finalnzero <- Filter(function(x) any(x > 0.75), summary_Placenta_male_ITU_n_finalnzero[,!c(\nzero\, \mean_cvm\, \median_cvm\)]) %>% colnames()
colnames(summary_Placenta_male_ITU_n_finalnzero) <- c(\non-zero\, \birth weight\, \birth length\, \head circumference\, \delivery mode (aided)\, \induced labor (yes)\, \parity (birth before)\, \maternal age\, \maternal BMI\, \maternal hypertension (yes)\, \maternal diabetes (yes)\, \maternal mental disorders (yes)\, \maternal smoking (yes)\, \mean cvm\, \median cvm\)
summary_Placenta_male_ITU_n_finalnzeroT <- as.data.frame(t(summary_Placenta_male_ITU_n_finalnzero[,-c(\non-zero\, \median cvm\, \mean cvm\)]))
summary_Placenta_male_ITU_n_finalnzeroT$variable <- rownames(summary_Placenta_male_ITU_n_finalnzeroT)
rownames(summary_Placenta_male_ITU_n_finalnzeroT) <- NULL
names(summary_Placenta_male_ITU_n_finalnzeroT)[names(summary_Placenta_male_ITU_n_finalnzeroT) == 'V1'] <- 'percent'
summary_Placenta_male_ITU_n_finalnzeroT <- summary_Placenta_male_ITU_n_finalnzeroT[order(summary_Placenta_male_ITU_n_finalnzeroT$percent),]

summary_Placenta_male_ITU_n_finalnzeroT$number <- seq(1, length(summary_Placenta_male_ITU_n_finalnzeroT$variable))

<!-- rnb-source-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->



<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxucGVyY192YXJzX1BsYWNlbnRhX21hbGVfSVRVX24gPC0gXG4gIGdncGxvdChzdW1tYXJ5X1BsYWNlbnRhX21hbGVfSVRVX25fZmluYWxuemVyb1QsIGFlcyhyZW9yZGVyKHZhcmlhYmxlLCBwZXJjZW50KSwgcGVyY2VudCwgZ3JvdXA9MSkpK1xuICBnZW9tX3BvaW50KCkrIGdlb21fbGluZSgpK1xuICB5bGFiKFwiJSBvY2N1cmVuY2UgaW4gbW9kZWxzIHdpdGggbnplcm8gY29lZmZpY2llbnRzID0gMlwiKStcbiAgc2NhbGVfeV9jb250aW51b3VzKGJyZWFrcz1jKDAuMSwwLjIsMC4zLDAuNCwwLjUsMC42LDAuNywwLjgsMC45KSkrXG4gIHhsYWIoXCJ2YXJpYWJsZVwiKStcbiAgY29vcmRfZmxpcCgpK1xuICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQ9MC43NSwgbGluZXR5cGU9XCJkb3R0ZWRcIikrXG4gIHRoZW1lX2J3KClcblxucGVyY192YXJzX1BsYWNlbnRhX21hbGVfSVRVX25cblxuIyBkZWNpZGUgZm9yIGN1dC1vZmYgJSAtPiBoZXJlIC43NVxuXG5GaWx0ZXIoZnVuY3Rpb24oeCkgYW55KHggPiAwLjc1KSwgc3VtbWFyeV9QbGFjZW50YV9tYWxlX0lUVV9uX2ZpbmFsbnplcm9bLCFjKFwibm9uLXplcm9cIiwgXCJtZWFuIGN2bVwiLCBcIm1lZGlhbiBjdm1cIildKVxuXG5gYGAifQ== -->

```r
perc_vars_Placenta_male_ITU_n <- 
  ggplot(summary_Placenta_male_ITU_n_finalnzeroT, aes(reorder(variable, percent), percent, group=1))+
  geom_point()+ geom_line()+
  ylab("% occurence in models with nzero coefficients = 2")+
  scale_y_continuous(breaks=c(0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9))+
  xlab("variable")+
  coord_flip()+
  geom_hline(yintercept=0.75, linetype="dotted")+
  theme_bw()

perc_vars_Placenta_male_ITU_n

# decide for cut-off % -> here .75

Filter(function(x) any(x > 0.75), summary_Placenta_male_ITU_n_finalnzero[,!c("non-zero", "mean cvm", "median cvm")])
png(filename="Results/Figures/elasticNet_singleTissues/Outcome_add/sex_split/varsPercent_Placenta_male.png", width=1100, height=1400, res=300)
perc_vars_Placenta_male_ITU_n
dev.off()
```r
pm2_Placenta_male_ITU_n_coef <-
  dcast(pm2_Placenta_male_ITU_n[,
                       as.list(unlist(
                         lapply(.SD,
                                function(x) {
                                  y <- unname(quantile(x[x != 0], probs = c(0.025, 0.975)))
                                  list(\non_zero\ = 100 * mean(x != 0),
                                       lcl = y[1],
                                       ucl = y[2],
                                       width = diff(y),
                                       median = median(x[x!= 0]))
                                }))),
                       .SDcols = c(\Child_Birth_Weight\, \Child_Birth_Length\, \Child_Head_Circumference_At_Birth\, \Delivery_mode_dichotomaided\, \Induced_Labouryes\, \Parity_dichotomgiven birth before\, \Maternal_Age_Years\, \Maternal_Body_Mass_Index_in_Early_Pregnancy\, \Maternal_Hypertension_dichotomhypertension in current pregnancy\, \Maternal_Diabetes_dichotomdiabetes in current pregnancy\, \Maternal_Mental_DisordersYes\, \smoking_dichotomyes\),
                       by = nzero][order(nzero)] %>%
          melt(id.var = \nzero\) %>%
          .[, metric := sub(\^.+\\.(.+)$\, \\\1\, variable)] %>%
          .[, variable := sub(\^(.+)\\..+$\, \\\1\, variable)] %>%
          .[nzero ==nzero_final_placenta_male], nzero+ variable ~ metric, value.var=\value\)

# get desired order of predictors
pm2_Placenta_male_ITU_n_coef <-
  pm2_Placenta_male_ITU_n_coef[match(c(\Child_Birth_Weight\, \Child_Birth_Length\, \Child_Head_Circumference_At_Birth\, \Delivery_mode_dichotomaided\, \Induced_Labouryes\, \Parity_dichotomgiven birth before\, \Maternal_Age_Years\, \Maternal_Body_Mass_Index_in_Early_Pregnancy\, \Maternal_Hypertension_dichotomhypertension in current pregnancy\, \Maternal_Diabetes_dichotomdiabetes in current pregnancy\, \Maternal_Mental_DisordersYes\, \smoking_dichotomyes\), pm2_Placenta_male_ITU_n_coef$variable),]
pm2_Placenta_male_ITU_n_coef$variable <- factor(pm2_Placenta_male_ITU_n_coef$variabl, levels=unique(pm2_Placenta_male_ITU_n_coef$variable))

<!-- rnb-source-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->



<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxuc2lnX3ZhcnNfUGxhY2VudGFfbWFsZV9JVFVfbiA8LVxuICBwbTJfUGxhY2VudGFfbWFsZV9JVFVfbl9jb2VmICU+JVxuICBnZ3Bsb3QyOjpnZ3Bsb3QoLikgK1xuICBnZ3Bsb3QyOjp0aGVtZV9idygpICtcbiAgZ2dwbG90Mjo6dGhlbWUoYXhpcy50ZXh0Lng9ZWxlbWVudF9ibGFuaygpKStcbiAgZ2dwbG90Mjo6YWVzKHg9XFxuemVyb1xcKStcbiAgZ2dwbG90Mjo6Z2VvbV9wb2ludChtYXBwaW5nID0gZ2dwbG90Mjo6YWVzKHkgPSB2YXJpYWJsZSwgc2l6ZSA9bm9uX3plcm8sIGFscGhhID0gbm9uX3plcm8sIGNvbG9yID0gbm9uX3plcm8pKSArXG4gIGdncGxvdDI6Omdlb21fdGV4dChhZXMoeT12YXJpYWJsZSwgbGFiZWw9c3ByaW50ZihcXCUwLjJmXFwsIHJvdW5kKG1lZGlhbiwgZGlnaXRzPTIpKSwgc2l6ZT01MCksaGp1c3Q9MCwgdmp1c3Q9MC41LCBudWRnZV94ID0gMC4xKStcbiAgZ2dwbG90Mjo6c2NhbGVfY29sb3JfZ3JhZGllbnQyKGhpZ2ggPSAnZ3JlZW4nLCBtaWQgPSBcXHB1cnBsZVxcLCBsb3cgPSBcXGJsYWNrXFwsIG1pZHBvaW50ID01MCkrXG4gIGdncGxvdDI6OnNjYWxlX2FscGhhKGd1aWRlID0gJ25vbmUnKStcbiAgZ2dwbG90Mjo6c2NhbGVfc2l6ZShndWlkZSA9ICdub25lJykrXG4gIGdncGxvdDI6OnNjYWxlX3lfZGlzY3JldGUobGFiZWxzPSBjKFxcYmlydGggd2VpZ2h0XFwsIFxcYmlydGggbGVuZ3RoXFwsIFxcaGVhZCBjaXJjdW1mZXJlbmNlXFwsIFxcZGVsaXZlcnkgbW9kZSAoYWlkZWQpXFwsIFxcaW5kdWNlZCBsYWJvciAoeWVzKVxcLCBcXHBhcml0eSAoYmlydGggYmVmb3JlKVxcLCBcXG1hdGVybmFsIGFnZVxcLCBcXG1hdGVybmFsIEJNSVxcLCBcXG1hdGVybmFsIGh5cGVydGVuc2lvbiAoeWVzKVxcLCBcXG1hdGVybmFsIGRpYWJldGVzICh5ZXMpXFwsIFxcbWF0ZXJuYWwgbWVudGFsIGRpc29yZGVycyAoeWVzKVxcLCBcXG1hdGVybmFsIHNtb2tpbmcgKHllcylcXCkpK1xuICBnZ3Bsb3QyOjpsYWJzKHk9XFxwcmVkaWN0b3JcXCwgeCA9IFxcbnVtYmVyIG9mIG5vbi16ZXJvIGNvZWZmaWNpZW50cyA9IDJcXCwgY29sb3I9XFwlXFwpXG5cbmBgYFxuYGBgIn0= -->

```r
```r
sig_vars_Placenta_male_ITU_n <-
  pm2_Placenta_male_ITU_n_coef %>%
  ggplot2::ggplot(.) +
  ggplot2::theme_bw() +
  ggplot2::theme(axis.text.x=element_blank())+
  ggplot2::aes(x=\nzero\)+
  ggplot2::geom_point(mapping = ggplot2::aes(y = variable, size =non_zero, alpha = non_zero, color = non_zero)) +
  ggplot2::geom_text(aes(y=variable, label=sprintf(\%0.2f\, round(median, digits=2)), size=50),hjust=0, vjust=0.5, nudge_x = 0.1)+
  ggplot2::scale_color_gradient2(high = 'green', mid = \purple\, low = \black\, midpoint =50)+
  ggplot2::scale_alpha(guide = 'none')+
  ggplot2::scale_size(guide = 'none')+
  ggplot2::scale_y_discrete(labels= c(\birth weight\, \birth length\, \head circumference\, \delivery mode (aided)\, \induced labor (yes)\, \parity (birth before)\, \maternal age\, \maternal BMI\, \maternal hypertension (yes)\, \maternal diabetes (yes)\, \maternal mental disorders (yes)\, \maternal smoking (yes)\))+
  ggplot2::labs(y=\predictor\, x = \number of non-zero coefficients = 2\, color=\%\)

<!-- rnb-source-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->



<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuY29lZl9QbGFjZW50YV9tYWxlX0lUVV9uIDwtIFxuICBnZ3Bsb3QocG0yX1BsYWNlbnRhX21hbGVfSVRVX25fY29lZiwgYWVzKHkgPSB2YXJpYWJsZSwgeD1tZWRpYW4pKStcbiAgZ2VvbV9wb2ludChtYXBwaW5nID0gZ2dwbG90Mjo6YWVzKHkgPSB2YXJpYWJsZSwgc2l6ZSA9bm9uX3plcm8sIGFscGhhID0gbm9uX3plcm8sIGNvbG9yID0gbm9uX3plcm8pKStcbiAgc2NhbGVfY29sb3JfZ3JhZGllbnQyKGhpZ2ggPSAnZ3JlZW4nLCBtaWQgPSBcInB1cnBsZVwiLCBsb3cgPSBcImJsYWNrXCIsIG1pZHBvaW50ID01MCwgbGltaXRzPWMoMCwxMDApKStcbiAgc2NhbGVfYWxwaGEoZ3VpZGUgPSAnbm9uZScpK1xuICBzY2FsZV9zaXplKGd1aWRlID0gJ25vbmUnKStcbiAgZ2VvbV9wb2ludCgpK1xuICBnZW9tX2Vycm9yYmFyKGFlcyh5ID0gdmFyaWFibGUsIHhtaW4gPSBsY2wsIHhtYXggPSB1Y2wpLCB3aWR0aCA9IDAuMikrXG4gIGxhYnMoeT1cInByZWRpY3RvclwiLCB4ID0gXCJcXG5tZWRpYW4gJiA5NSUgQ0kgb2YgY29lZmZpY2llbnQgKG92ZXIgYm9vdHN0cmFwcylcIiwgY29sb3I9XCIlXCIpK1xuICBzY2FsZV94X2NvbnRpbnVvdXMobGltaXRzPWMoLTAuNCwwLjQpLCBicmVha3M9YygtLjQsLS4zLC0uMiwgLS4xLCAwLCAuMSwgLjIsIC4zLCAuNCkpK1xuICBzY2FsZV95X2Rpc2NyZXRlKGxhYmVscz0gYyhcImJpcnRoIHdlaWdodFwiLCBcImJpcnRoIGxlbmd0aFwiLCBcImhlYWQgY2lyY3VtZmVyZW5jZVwiLCBcImRlbGl2ZXJ5IG1vZGUgKGFpZGVkKVwiLCBcImluZHVjZWQgbGFib3IgKHllcylcIiwgXCJwYXJpdHkgKGJpcnRoIGJlZm9yZSlcIiwgXCJtYXRlcm5hbCBhZ2VcIiwgXCJtYXRlcm5hbCBCTUlcIiwgXCJtYXRlcm5hbCBoeXBlcnRlbnNpb24gKHllcylcIiwgXCJtYXRlcm5hbCBkaWFiZXRlcyAoeWVzKVwiLCBcIm1hdGVybmFsIG1lbnRhbCBkaXNvcmRlcnMgKHllcylcIiwgXCJtYXRlcm5hbCBzbW9raW5nICh5ZXMpXCIpKStcbiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0PTAsIGxpbmV0eXBlPVwiZGFzaGVkXCIpK1xuICB0aGVtZV9idygpK1xuICB0aGVtZSh0ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNSksIGF4aXMudGl0bGUueD0gZWxlbWVudF90ZXh0KHNpemU9MTUpLCBheGlzLnRpdGxlLnk9IGVsZW1lbnRfdGV4dChzaXplPTE1KSlcblxuXG5jb2VmX1BsYWNlbnRhX21hbGVfSVRVX25cbmBgYCJ9 -->

```r
coef_Placenta_male_ITU_n <- 
  ggplot(pm2_Placenta_male_ITU_n_coef, aes(y = variable, x=median))+
  geom_point(mapping = ggplot2::aes(y = variable, size =non_zero, alpha = non_zero, color = non_zero))+
  scale_color_gradient2(high = 'green', mid = "purple", low = "black", midpoint =50, limits=c(0,100))+
  scale_alpha(guide = 'none')+
  scale_size(guide = 'none')+
  geom_point()+
  geom_errorbar(aes(y = variable, xmin = lcl, xmax = ucl), width = 0.2)+
  labs(y="predictor", x = "\nmedian & 95% CI of coefficient (over bootstraps)", color="%")+
  scale_x_continuous(limits=c(-0.4,0.4), breaks=c(-.4,-.3,-.2, -.1, 0, .1, .2, .3, .4))+
  scale_y_discrete(labels= c("birth weight", "birth length", "head circumference", "delivery mode (aided)", "induced labor (yes)", "parity (birth before)", "maternal age", "maternal BMI", "maternal hypertension (yes)", "maternal diabetes (yes)", "maternal mental disorders (yes)", "maternal smoking (yes)"))+
  geom_vline(xintercept=0, linetype="dashed")+
  theme_bw()+
  theme(text = element_text(size = 15), axis.title.x= element_text(size=15), axis.title.y= element_text(size=15))


coef_Placenta_male_ITU_n
png(filename="Results/Figures/elasticNet_singleTissues/Outcome_add/sex_split/coef_Placenta_male.png", width=2800, height=1400, res=400)
coef_Placenta_male_ITU_n
dev.off()
p1 <-
  csummary_Placenta_male_ITU_n %>%
  melt(id.vars = c("nzero", "mean_cvm", "median_cvm")) %>%
  ggplot2::ggplot(.) +
  ggplot2::theme_bw() +
  ggplot2::aes(x = nzero) +
  ggplot2::geom_point(mapping = ggplot2::aes(y = variable, size = value, alpha = value, color = value*100)) +
  ggplot2::scale_color_gradient2(high = 'green', mid = "purple", low = "black", midpoint =50)+
  ggplot2::scale_alpha(guide = 'none')+
  ggplot2::scale_size(guide = 'none')+
  ggplot2::scale_y_discrete(labels= c("birth weight", "birth length", "head circumference", "delivery mode (aided)", "induced labor (yes)", "parity (birth before)", "maternal age", "maternal BMI", "maternal hypertension (yes)", "maternal diabetes (yes)", "maternal mental disorders (yes)", "maternal smoking (yes)"))+
  ggplot2::scale_x_continuous(breaks=0:14, labels=)+
  ggplot2::labs(y="predictor", x = "\nnumber of non-zero coefficients", color="%")+
  ggplot2::theme(text = element_text(size = 17), axis.title.x= element_text(size=15), axis.title.y= element_text(size=15), legend.position = "none")
  
p2 <- 
  ggplot(pm2_Placenta_male_ITU_n_coef, aes(y = variable, x=median))+
  geom_point(mapping = ggplot2::aes(y = variable, size =non_zero, alpha = non_zero, color = non_zero))+
  scale_color_gradient2(high = 'green', mid = "purple", low = "black", midpoint =50, limits=c(0,100))+
  scale_alpha(guide = 'none')+
  scale_size(guide = 'none')+
  geom_point()+
  geom_errorbar(aes(y = variable, xmin = lcl, xmax = ucl), width = 0.2)+
  labs(y="", x = "\nmedian & 95% CI of coefficient (over bootstraps)", color="%")+
  scale_x_continuous(limits=c(-0.4,0.4), breaks=c(-.4,-.3,-.2, -.1, 0, .1, .2, .3, .4))+
  scale_y_discrete(labels= c("birth weight", "birth length", "head circumference", "delivery mode (aided)", "induced labor (yes)", "parity (birth before)", "maternal age", "maternal BMI", "maternal hypertension (yes)", "maternal diabetes (yes)", "maternal mental disorders (yes)", "maternal smoking (yes)"))+
  geom_vline(xintercept=0, linetype="dashed")+
  theme_bw()+
  ggtitle("nzero = 5")+
  theme(text = element_text(size =17), axis.title.x= element_text(size=15), axis.title.y= element_text(size=15), plot.title = element_text(size=15), axis.text.y=element_blank())

g1 <- ggplotGrob(p1)
g2 <- ggplotGrob(p2)
g <- cbind(g1, g2, size = "last")
g$heights <- unit.pmax(g1$heights, g2$heights)

png(filename="Results/Figures/elasticNet_singleTissues/Outcome_add/sex_split/Model_coef_Placenta_male.png", width=5800, height=1600, res=400)
grid.draw(g)
dev.off()

to the top

females

```r
# in case you want to start from here
load(\InputData/ClockCalculationsInput/Reg_Input_Data_Placenta_female_ITU_EAAR_noNa_n.Rdata\)
Reg_Input_Data_Placenta_female_ITU_EAAR_noNa_n$Child_Sex <- NULL

<!-- rnb-source-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->




<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxueXJjX21hdF9JVFVfUGxhY2VudGFfZmVtYWxlX24gPC0gbWF0cml4KFJlZ19JbnB1dF9EYXRhX1BsYWNlbnRhX2ZlbWFsZV9JVFVfRUFBUl9ub05hX24kRUFBUl9MZWUpXG54cmNfbWF0X0lUVV9QbGFjZW50YV9mZW1hbGVfbiA8LSBtb2RlbC5tYXRyaXgoIH4gLiAtIEVBQVJfTGVlLCBkYXRhID0gUmVnX0lucHV0X0RhdGFfUGxhY2VudGFfZmVtYWxlX0lUVV9FQUFSX25vTmFfbilbLCAtMV1cbnlyY19tYXRfSVRVX3NjYWxlZF9QbGFjZW50YV9mZW1hbGVfbiA8LSBzY2FsZSh5cmNfbWF0X0lUVV9QbGFjZW50YV9mZW1hbGVfbilcbnhyY19tYXRfSVRVX3NjYWxlZF9QbGFjZW50YV9mZW1hbGVfbiA8LSBzY2FsZSh4cmNfbWF0X0lUVV9QbGFjZW50YV9mZW1hbGVfbilcbmBgYFxuYGBgIn0= -->

```r
```r
yrc_mat_ITU_Placenta_female_n <- matrix(Reg_Input_Data_Placenta_female_ITU_EAAR_noNa_n$EAAR_Lee)
xrc_mat_ITU_Placenta_female_n <- model.matrix( ~ . - EAAR_Lee, data = Reg_Input_Data_Placenta_female_ITU_EAAR_noNa_n)[, -1]
yrc_mat_ITU_scaled_Placenta_female_n <- scale(yrc_mat_ITU_Placenta_female_n)
xrc_mat_ITU_scaled_Placenta_female_n <- scale(xrc_mat_ITU_Placenta_female_n)

<!-- rnb-source-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->


<!-- set seed -->
<!-- ```{r} -->
<!-- set.seed(2020) -->
<!-- ``` -->


<!-- ```{r, warning=F} -->
<!--   nboot = 1000 -->

<!--   start_time <- Sys.time() -->
<!--   bootstraps_Placenta_female_ITU_n <- replicate(nboot, { -->
<!--     rws <- sample(1:nrow(xrc_mat_ITU_scaled_Placenta_female_n), replace = TRUE) -->
<!--     ensr(xrc_mat_ITU_scaled_Placenta_female_n[rws, ], yrc_mat_ITU_scaled_Placenta_female_n[rws, ], standardized = FALSE, family="gaussian", nlambda=100, nfolds=10, alpha=c(0.0,0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1.0)) -->
<!--   }, -->
<!--   simplify = FALSE) -->

<!--   end_time <- Sys.time() -->
<!--   end_time - start_time -->

<!-- ``` -->

<!-- ```{r} -->
<!-- save(bootstraps_Placenta_female_ITU_n, file="InputData/Data_ElasticNets/bootstraps_Placenta_female_ITU_n_1000.Rdata") -->
<!-- ``` -->



<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxubG9hZChcXElucHV0RGF0YS9EYXRhX0VsYXN0aWNOZXRzL2Jvb3RzdHJhcHNfUGxhY2VudGFfZmVtYWxlX0lUVV9uXzEwMDAuUmRhdGFcXClcbmBgYFxuYGBgIn0= -->

```r
```r
load(\InputData/Data_ElasticNets/bootstraps_Placenta_female_ITU_n_1000.Rdata\)

<!-- rnb-source-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->




<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuc3VtbWFyaWVzX1BsYWNlbnRhX2ZlbWFsZV9JVFVfbiA8LVxuICBib290c3RyYXBzX1BsYWNlbnRhX2ZlbWFsZV9JVFVfbiAlPiVcbiAgbGFwcGx5KHN1bW1hcnkpICU+JVxuICByYmluZGxpc3QoaWRjb2wgPSBcImJvb3RzdHJhcFwiKVxuXG5zdW1tYXJpZXNfUGxhY2VudGFfZmVtYWxlX0lUVV9uXG5gYGAifQ== -->

```r
summaries_Placenta_female_ITU_n <-
  bootstraps_Placenta_female_ITU_n %>%
  lapply(summary) %>%
  rbindlist(idcol = "bootstrap")

summaries_Placenta_female_ITU_n
png(filename="Results/Figures/elasticNet_singleTissues/Outcome_add/sex_split/bootstraps_Placenta_FEMALE.png", width=800, height=600)
summaries_Placenta_female_ITU_n[, .SD[cvm == min(cvm)], by = c("bootstrap", "nzero")] %>%
  ggplot2::ggplot(data = .) +
  ggplot2::aes(x = nzero, y = cvm, group = bootstrap) +
  ggplot2::geom_point() +
  ggplot2::geom_line()
dev.off()
```r
load(\InputData/Data_ElasticNets/pm2_Placenta_female_ITU_n.Rdata\)
# coefficient values for the models with smallest cvm by number of non-erzo coefficients and bootstrap

<!-- rnb-source-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->




<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuY3N1bW1hcnlfUGxhY2VudGFfZmVtYWxlX0lUVV9uIDwtIFJlZHVjZShmdW5jdGlvbih4LHkpIG1lcmdlKHggPSB4LCB5ID0geSwgYnkgPSBcIm56ZXJvXCIpLCBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3QocG0yX1BsYWNlbnRhX2ZlbWFsZV9JVFVfblssIGxhcHBseSguU0QsIGZ1bmN0aW9uKHgpIHttZWFuKHggIT0gMCl9KSwgLlNEY29scyA9IGMoXCJDaGlsZF9CaXJ0aF9XZWlnaHRcIiwgXCJDaGlsZF9CaXJ0aF9MZW5ndGhcIiwgXCJDaGlsZF9IZWFkX0NpcmN1bWZlcmVuY2VfQXRfQmlydGhcIiwgXCJEZWxpdmVyeV9tb2RlX2RpY2hvdG9tYWlkZWRcIiwgXCJJbmR1Y2VkX0xhYm91cnllc1wiLCBcIlBhcml0eV9kaWNob3RvbWdpdmVuIGJpcnRoIGJlZm9yZVwiLCBcIk1hdGVybmFsX0FnZV9ZZWFyc1wiLCBcIk1hdGVybmFsX0JvZHlfTWFzc19JbmRleF9pbl9FYXJseV9QcmVnbmFuY3lcIiwgXCJNYXRlcm5hbF9IeXBlcnRlbnNpb25fZGljaG90b21oeXBlcnRlbnNpb24gaW4gY3VycmVudCBwcmVnbmFuY3lcIiwgXCJNYXRlcm5hbF9EaWFiZXRlc19kaWNob3RvbWRpYWJldGVzIGluIGN1cnJlbnQgcHJlZ25hbmN5XCIsIFwiTWF0ZXJuYWxfTWVudGFsX0Rpc29yZGVyc1llc1wiLCBcInNtb2tpbmdfZGljaG90b215ZXNcIiksIGJ5ID0gbnplcm9dXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG0yX1BsYWNlbnRhX2ZlbWFsZV9JVFVfblssIC4obWVhbl9jdm0gPSBtZWFuKGN2bSkpLCBieSA9IG56ZXJvXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG0yX1BsYWNlbnRhX2ZlbWFsZV9JVFVfblssIC4obWVkaWFuX2N2bSA9IG1lZGlhbihjdm0pKSwgYnkgPSBuemVyb11cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkpW29yZGVyKG56ZXJvKV1cblxuY3N1bW1hcnlfUGxhY2VudGFfZmVtYWxlX0lUVV9uXG5gYGAifQ== -->

```r
csummary_Placenta_female_ITU_n <- Reduce(function(x,y) merge(x = x, y = y, by = "nzero"), 
                                       list(pm2_Placenta_female_ITU_n[, lapply(.SD, function(x) {mean(x != 0)}), .SDcols = c("Child_Birth_Weight", "Child_Birth_Length", "Child_Head_Circumference_At_Birth", "Delivery_mode_dichotomaided", "Induced_Labouryes", "Parity_dichotomgiven birth before", "Maternal_Age_Years", "Maternal_Body_Mass_Index_in_Early_Pregnancy", "Maternal_Hypertension_dichotomhypertension in current pregnancy", "Maternal_Diabetes_dichotomdiabetes in current pregnancy", "Maternal_Mental_DisordersYes", "smoking_dichotomyes"), by = nzero]
                                            ,
                                            pm2_Placenta_female_ITU_n[, .(mean_cvm = mean(cvm)), by = nzero],
                                            pm2_Placenta_female_ITU_n[, .(median_cvm = median(cvm)), by = nzero]
                                       ))[order(nzero)]

csummary_Placenta_female_ITU_n
g1_Placenta_female_ITU_n <-
  csummary_Placenta_female_ITU_n %>%
  melt(id.vars = c("nzero", "mean_cvm", "median_cvm")) %>%
  ggplot2::ggplot(.) +
  ggplot2::theme_bw() +
  ggplot2::aes(x = nzero) +
  ggplot2::geom_point(mapping = ggplot2::aes(y = variable, size = value, alpha = value, color = value*100)) +
  ggplot2::scale_color_gradient2(high = 'green', mid = "purple", low = "black", midpoint =50)+
  ggplot2::scale_alpha(guide = 'none')+
  ggplot2::scale_size(guide = 'none')+
  ggplot2::scale_y_discrete(labels= c("birth weight", "birth length", "head circumference", "delivery mode", "induced labor", "parity", "maternal age", "maternal BMI", "maternal hypertension", "maternal diabetes", "maternal mental disorders", "maternal smoking"))+
  ggplot2::scale_x_continuous(breaks=0:14, labels=)+
  ggplot2::labs(y="predictor", x = "number of non-zero coefficients", color="%")+
  ggplot2::theme(text = element_text(size = 15), axis.title.x= element_text(size=15), axis.title.y= element_text(size=15))
  

g2_Placenta_female_ITU_n <-
  csummary_Placenta_female_ITU_n %>%
  ggplot2::ggplot(.) +
  ggplot2::theme_bw() +
  ggplot2::aes(x = nzero, y = median_cvm) +
  ggplot2::geom_point() + ggplot2::geom_line()+
  ggplot2::labs(y="median cvm", x = "number of non-zero coefficients")+
  ggplot2::scale_x_continuous(breaks=0:14, labels=)+
  ggplot2::theme(axis.text=element_text(size=15),axis.title=element_text(size=18))

gridExtra::grid.arrange(g1_Placenta_female_ITU_n, g2_Placenta_female_ITU_n, ncol = 1)
png(filename="Results/Figures/elasticNet_singleTissues/Outcome_add/sex_split/Model_Placenta_female.png", width=2800, height=1400, res=400)
g1_Placenta_female_ITU_n
dev.off()
png(filename="Results/Figures/elasticNet_singleTissues/Outcome_add/sex_split/bootstrapModels_Placenta_female.png", width=2400, height=1800, res=300)
gridExtra::grid.arrange(g1_Placenta_female_ITU_n, g2_Placenta_female_ITU_n, ncol = 1)
dev.off()
elbow_finder(csummary_Placenta_female_ITU_n$nzero, csummary_Placenta_female_ITU_n$median_cvm)

nzero_indices_Cord <- data.frame(t(elbow_finder(csummary_Placenta_female_ITU_n$nzero, csummary_Placenta_female_ITU_n$median_cvm)))
colnames(nzero_indices_Cord) <- c("x", "y")
rownames(nzero_indices_Cord) <- NULL
```r
nzero_final_placenta_female <- 7

<!-- rnb-source-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->




<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuY3N1bW1hcnlfUGxhY2VudGFfZmVtYWxlX0lUVV9uW256ZXJvICVpbiUgbnplcm9fZmluYWxfcGxhY2VudGFfZmVtYWxlXVxuYGBgIn0= -->

```r
csummary_Placenta_female_ITU_n[nzero %in% nzero_final_placenta_female]
nonzero_choose_Placenta_female <- ggplot2::ggplot(csummary_Placenta_female_ITU_n) +
  ggplot2::theme_bw()+
  ggplot2::aes(x = nzero, y = median_cvm) +
  ggplot2::scale_x_continuous(breaks=c(0:17))+
  ggplot2::geom_point() + ggplot2::geom_line()+
  ggplot2::geom_point(data=nzero_indices_Cord, aes(x=x, y=y), colour="red", size=2)+
  ggplot2::ylab("median of minimum cross-validation errors over bootstraps")+
  ggplot2::xlab("number of non-zero coefficients")+
  ggplot2::geom_segment(aes(x = nzero[1], y = median_cvm[1], xend = nzero[13], yend = median_cvm[13], colour = "segment"), data = csummary_Placenta_female_ITU_n, show.legend = F)

nonzero_choose_Placenta_female
png(filename="Results/Figures/elasticNet_singleTissues/Outcome_add/sex_split/nzero_choose_Placenta_female.png", width=1600, height=1400, res=300)
nonzero_choose_Placenta_female
dev.off()
```r
summary_Placenta_female_ITU_n_finalnzero <- csummary_Placenta_female_ITU_n[nzero %in% nzero_final_placenta_female]
sig_var_names_Placenta_female_ITU_n_finalnzero <- Filter(function(x) any(x > 0.75), summary_Placenta_female_ITU_n_finalnzero[,!c(\nzero\, \mean_cvm\, \median_cvm\)]) %>% colnames()
colnames(summary_Placenta_female_ITU_n_finalnzero) <- c(\non-zero\, \birth weight\, \birth length\, \head circumference\, \delivery mode (aided)\, \induced labor (yes)\, \parity (birth before)\, \maternal age\, \maternal BMI\, \maternal hypertension (yes)\, \maternal diabetes (yes)\, \maternal mental disorders (yes)\, \maternal smoking (yes)\, \mean cvm\, \median cvm\)
summary_Placenta_female_ITU_n_finalnzeroT <- as.data.frame(t(summary_Placenta_female_ITU_n_finalnzero[,-c(\non-zero\, \median cvm\, \mean cvm\)]))
summary_Placenta_female_ITU_n_finalnzeroT$variable <- rownames(summary_Placenta_female_ITU_n_finalnzeroT)
rownames(summary_Placenta_female_ITU_n_finalnzeroT) <- NULL
names(summary_Placenta_female_ITU_n_finalnzeroT)[names(summary_Placenta_female_ITU_n_finalnzeroT) == 'V1'] <- 'percent'
summary_Placenta_female_ITU_n_finalnzeroT <- summary_Placenta_female_ITU_n_finalnzeroT[order(summary_Placenta_female_ITU_n_finalnzeroT$percent),]

summary_Placenta_female_ITU_n_finalnzeroT$number <- seq(1, length(summary_Placenta_female_ITU_n_finalnzeroT$variable))

<!-- rnb-source-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->



<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxucGVyY192YXJzX1BsYWNlbnRhX2ZlbWFsZV9JVFVfbiA8LSBcbiAgZ2dwbG90KHN1bW1hcnlfUGxhY2VudGFfZmVtYWxlX0lUVV9uX2ZpbmFsbnplcm9ULCBhZXMocmVvcmRlcih2YXJpYWJsZSwgcGVyY2VudCksIHBlcmNlbnQsIGdyb3VwPTEpKStcbiAgZ2VvbV9wb2ludCgpKyBnZW9tX2xpbmUoKStcbiAgeWxhYihcIiUgb2NjdXJlbmNlIGluIG1vZGVscyB3aXRoIG56ZXJvIGNvZWZmaWNpZW50cyA9IDdcIikrXG4gIHNjYWxlX3lfY29udGludW91cyhicmVha3M9YygwLjEsMC4yLDAuMywwLjQsMC41LDAuNiwwLjcsMC44LDAuOSkpK1xuICB4bGFiKFwidmFyaWFibGVcIikrXG4gIGNvb3JkX2ZsaXAoKStcbiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0PTAuNzUsIGxpbmV0eXBlPVwiZG90dGVkXCIpK1xuICB0aGVtZV9idygpXG5cbnBlcmNfdmFyc19QbGFjZW50YV9mZW1hbGVfSVRVX25cblxuIyBkZWNpZGUgZm9yIGN1dC1vZmYgJSAtPiBoZXJlIC43NVxuXG5GaWx0ZXIoZnVuY3Rpb24oeCkgYW55KHggPiAwLjc1KSwgc3VtbWFyeV9QbGFjZW50YV9mZW1hbGVfSVRVX25fZmluYWxuemVyb1ssIWMoXCJub24temVyb1wiLCBcIm1lYW4gY3ZtXCIsIFwibWVkaWFuIGN2bVwiKV0pXG5cbmBgYCJ9 -->

```r
perc_vars_Placenta_female_ITU_n <- 
  ggplot(summary_Placenta_female_ITU_n_finalnzeroT, aes(reorder(variable, percent), percent, group=1))+
  geom_point()+ geom_line()+
  ylab("% occurence in models with nzero coefficients = 7")+
  scale_y_continuous(breaks=c(0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9))+
  xlab("variable")+
  coord_flip()+
  geom_hline(yintercept=0.75, linetype="dotted")+
  theme_bw()

perc_vars_Placenta_female_ITU_n

# decide for cut-off % -> here .75

Filter(function(x) any(x > 0.75), summary_Placenta_female_ITU_n_finalnzero[,!c("non-zero", "mean cvm", "median cvm")])
png(filename="Results/Figures/elasticNet_singleTissues/Outcome_add/sex_split/varsPercent_Placenta_female.png", width=1100, height=1400, res=300)
perc_vars_Placenta_female_ITU_n
dev.off()
```r
pm2_Placenta_female_ITU_n_coef <-
  dcast(pm2_Placenta_female_ITU_n[,
                                as.list(unlist(
                                  lapply(.SD,
                                         function(x) {
                                           y <- unname(quantile(x[x != 0], probs = c(0.025, 0.975)))
                                           list(\non_zero\ = 100 * mean(x != 0),
                                                lcl = y[1],
                                                ucl = y[2],
                                                width = diff(y),
                                                median = median(x[x!= 0]))
                                         }))),
                                .SDcols = c(\Child_Birth_Weight\, \Child_Birth_Length\, \Child_Head_Circumference_At_Birth\, \Delivery_mode_dichotomaided\, \Induced_Labouryes\, \Parity_dichotomgiven birth before\, \Maternal_Age_Years\, \Maternal_Body_Mass_Index_in_Early_Pregnancy\, \Maternal_Hypertension_dichotomhypertension in current pregnancy\, \Maternal_Diabetes_dichotomdiabetes in current pregnancy\, \Maternal_Mental_DisordersYes\, \smoking_dichotomyes\),
                                by = nzero][order(nzero)] %>%
          melt(id.var = \nzero\) %>%
          .[, metric := sub(\^.+\\.(.+)$\, \\\1\, variable)] %>%
          .[, variable := sub(\^(.+)\\..+$\, \\\1\, variable)] %>%
          .[nzero ==nzero_final_placenta_female], nzero+ variable ~ metric, value.var=\value\)

# get desired order of predictors
pm2_Placenta_female_ITU_n_coef <-
  pm2_Placenta_female_ITU_n_coef[match(c(\Child_Birth_Weight\, \Child_Birth_Length\, \Child_Head_Circumference_At_Birth\, \Delivery_mode_dichotomaided\, \Induced_Labouryes\, \Parity_dichotomgiven birth before\, \Maternal_Age_Years\, \Maternal_Body_Mass_Index_in_Early_Pregnancy\, \Maternal_Hypertension_dichotomhypertension in current pregnancy\, \Maternal_Diabetes_dichotomdiabetes in current pregnancy\, \Maternal_Mental_DisordersYes\, \smoking_dichotomyes\), pm2_Placenta_female_ITU_n_coef$variable),]
pm2_Placenta_female_ITU_n_coef$variable <- factor(pm2_Placenta_female_ITU_n_coef$variabl, levels=unique(pm2_Placenta_female_ITU_n_coef$variable))

<!-- rnb-source-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->




<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxuc2lnX3ZhcnNfUGxhY2VudGFfZmVtYWxlX0lUVV9uIDwtXG4gIHBtMl9QbGFjZW50YV9mZW1hbGVfSVRVX25fY29lZiAlPiVcbiAgZ2dwbG90Mjo6Z2dwbG90KC4pICtcbiAgZ2dwbG90Mjo6dGhlbWVfYncoKSArXG4gIGdncGxvdDI6OnRoZW1lKGF4aXMudGV4dC54PWVsZW1lbnRfYmxhbmsoKSkrXG4gIGdncGxvdDI6OmFlcyh4PVxcbnplcm9cXCkrXG4gIGdncGxvdDI6Omdlb21fcG9pbnQobWFwcGluZyA9IGdncGxvdDI6OmFlcyh5ID0gdmFyaWFibGUsIHNpemUgPW5vbl96ZXJvLCBhbHBoYSA9IG5vbl96ZXJvLCBjb2xvciA9IG5vbl96ZXJvKSkgK1xuICBnZ3Bsb3QyOjpnZW9tX3RleHQoYWVzKHk9dmFyaWFibGUsIGxhYmVsPXNwcmludGYoXFwlMC4yZlxcLCByb3VuZChtZWRpYW4sIGRpZ2l0cz0yKSksIHNpemU9NTApLGhqdXN0PTAsIHZqdXN0PTAuNSwgbnVkZ2VfeCA9IDAuMSkrXG4gIGdncGxvdDI6OnNjYWxlX2NvbG9yX2dyYWRpZW50MihoaWdoID0gJ2dyZWVuJywgbWlkID0gXFxwdXJwbGVcXCwgbG93ID0gXFxibGFja1xcLCBtaWRwb2ludCA9NTApK1xuICBnZ3Bsb3QyOjpzY2FsZV9hbHBoYShndWlkZSA9ICdub25lJykrXG4gIGdncGxvdDI6OnNjYWxlX3NpemUoZ3VpZGUgPSAnbm9uZScpK1xuICBnZ3Bsb3QyOjpzY2FsZV95X2Rpc2NyZXRlKGxhYmVscz0gYyhcXGJpcnRoIHdlaWdodFxcLCBcXGJpcnRoIGxlbmd0aFxcLCBcXGhlYWQgY2lyY3VtZmVyZW5jZVxcLCBcXGRlbGl2ZXJ5IG1vZGUgKGFpZGVkKVxcLCBcXGluZHVjZWQgbGFib3IgKHllcylcXCwgXFxwYXJpdHkgKGJpcnRoIGJlZm9yZSlcXCwgXFxtYXRlcm5hbCBhZ2VcXCwgXFxtYXRlcm5hbCBCTUlcXCwgXFxtYXRlcm5hbCBoeXBlcnRlbnNpb24gKHllcylcXCwgXFxtYXRlcm5hbCBkaWFiZXRlcyAoeWVzKVxcLCBcXG1hdGVybmFsIG1lbnRhbCBkaXNvcmRlcnMgKHllcylcXCwgXFxtYXRlcm5hbCBzbW9raW5nICh5ZXMpXFwpKStcbiAgZ2dwbG90Mjo6bGFicyh5PVxccHJlZGljdG9yXFwsIHggPSBcXG51bWJlciBvZiBub24temVybyBjb2VmZmljaWVudHMgPSA0XFwsIGNvbG9yPVxcJVxcKVxuXG5gYGBcbmBgYCJ9 -->

```r
```r
sig_vars_Placenta_female_ITU_n <-
  pm2_Placenta_female_ITU_n_coef %>%
  ggplot2::ggplot(.) +
  ggplot2::theme_bw() +
  ggplot2::theme(axis.text.x=element_blank())+
  ggplot2::aes(x=\nzero\)+
  ggplot2::geom_point(mapping = ggplot2::aes(y = variable, size =non_zero, alpha = non_zero, color = non_zero)) +
  ggplot2::geom_text(aes(y=variable, label=sprintf(\%0.2f\, round(median, digits=2)), size=50),hjust=0, vjust=0.5, nudge_x = 0.1)+
  ggplot2::scale_color_gradient2(high = 'green', mid = \purple\, low = \black\, midpoint =50)+
  ggplot2::scale_alpha(guide = 'none')+
  ggplot2::scale_size(guide = 'none')+
  ggplot2::scale_y_discrete(labels= c(\birth weight\, \birth length\, \head circumference\, \delivery mode (aided)\, \induced labor (yes)\, \parity (birth before)\, \maternal age\, \maternal BMI\, \maternal hypertension (yes)\, \maternal diabetes (yes)\, \maternal mental disorders (yes)\, \maternal smoking (yes)\))+
  ggplot2::labs(y=\predictor\, x = \number of non-zero coefficients = 4\, color=\%\)

<!-- rnb-source-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->



<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuY29lZl9QbGFjZW50YV9mZW1hbGVfSVRVX24gPC0gXG4gIGdncGxvdChwbTJfUGxhY2VudGFfZmVtYWxlX0lUVV9uX2NvZWYsIGFlcyh5ID0gdmFyaWFibGUsIHg9bWVkaWFuKSkrXG4gIGdlb21fcG9pbnQobWFwcGluZyA9IGdncGxvdDI6OmFlcyh5ID0gdmFyaWFibGUsIHNpemUgPW5vbl96ZXJvLCBhbHBoYSA9IG5vbl96ZXJvLCBjb2xvciA9IG5vbl96ZXJvKSkrXG4gIHNjYWxlX2NvbG9yX2dyYWRpZW50MihoaWdoID0gJ2dyZWVuJywgbWlkID0gXCJwdXJwbGVcIiwgbG93ID0gXCJibGFja1wiLCBtaWRwb2ludCA9NTAsIGxpbWl0cz1jKDAsMTAwKSkrXG4gIHNjYWxlX2FscGhhKGd1aWRlID0gJ25vbmUnKStcbiAgc2NhbGVfc2l6ZShndWlkZSA9ICdub25lJykrXG4gIGdlb21fcG9pbnQoKStcbiAgZ2VvbV9lcnJvcmJhcihhZXMoeSA9IHZhcmlhYmxlLCB4bWluID0gbGNsLCB4bWF4ID0gdWNsKSwgd2lkdGggPSAwLjIpK1xuICBsYWJzKHk9XCJwcmVkaWN0b3JcIiwgeCA9IFwiXFxubWVkaWFuICYgOTUlIENJIG9mIGNvZWZmaWNpZW50IChvdmVyIGJvb3RzdHJhcHMpXCIsIGNvbG9yPVwiJVwiKStcbiAgc2NhbGVfeF9jb250aW51b3VzKGxpbWl0cz1jKC0wLjQsMC40KSwgYnJlYWtzPWMoLS40LC0uMywtLjIsIC0uMSwgMCwgLjEsIC4yLCAuMywgLjQpKStcbiAgc2NhbGVfeV9kaXNjcmV0ZShsYWJlbHM9IGMoXCJiaXJ0aCB3ZWlnaHRcIiwgXCJiaXJ0aCBsZW5ndGhcIiwgXCJoZWFkIGNpcmN1bWZlcmVuY2VcIiwgXCJkZWxpdmVyeSBtb2RlIChhaWRlZClcIiwgXCJpbmR1Y2VkIGxhYm9yICh5ZXMpXCIsIFwicGFyaXR5IChiaXJ0aCBiZWZvcmUpXCIsIFwibWF0ZXJuYWwgYWdlXCIsIFwibWF0ZXJuYWwgQk1JXCIsIFwibWF0ZXJuYWwgaHlwZXJ0ZW5zaW9uICh5ZXMpXCIsIFwibWF0ZXJuYWwgZGlhYmV0ZXMgKHllcylcIiwgXCJtYXRlcm5hbCBtZW50YWwgZGlzb3JkZXJzICh5ZXMpXCIsIFwibWF0ZXJuYWwgc21va2luZyAoeWVzKVwiKSkrXG4gIGdlb21fdmxpbmUoeGludGVyY2VwdD0wLCBsaW5ldHlwZT1cImRhc2hlZFwiKStcbiAgdGhlbWVfYncoKStcbiAgdGhlbWUodGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTUpLCBheGlzLnRpdGxlLng9IGVsZW1lbnRfdGV4dChzaXplPTE1KSwgYXhpcy50aXRsZS55PSBlbGVtZW50X3RleHQoc2l6ZT0xNSkpXG5cblxuY29lZl9QbGFjZW50YV9mZW1hbGVfSVRVX25cbmBgYCJ9 -->

```r
coef_Placenta_female_ITU_n <- 
  ggplot(pm2_Placenta_female_ITU_n_coef, aes(y = variable, x=median))+
  geom_point(mapping = ggplot2::aes(y = variable, size =non_zero, alpha = non_zero, color = non_zero))+
  scale_color_gradient2(high = 'green', mid = "purple", low = "black", midpoint =50, limits=c(0,100))+
  scale_alpha(guide = 'none')+
  scale_size(guide = 'none')+
  geom_point()+
  geom_errorbar(aes(y = variable, xmin = lcl, xmax = ucl), width = 0.2)+
  labs(y="predictor", x = "\nmedian & 95% CI of coefficient (over bootstraps)", color="%")+
  scale_x_continuous(limits=c(-0.4,0.4), breaks=c(-.4,-.3,-.2, -.1, 0, .1, .2, .3, .4))+
  scale_y_discrete(labels= c("birth weight", "birth length", "head circumference", "delivery mode (aided)", "induced labor (yes)", "parity (birth before)", "maternal age", "maternal BMI", "maternal hypertension (yes)", "maternal diabetes (yes)", "maternal mental disorders (yes)", "maternal smoking (yes)"))+
  geom_vline(xintercept=0, linetype="dashed")+
  theme_bw()+
  theme(text = element_text(size = 15), axis.title.x= element_text(size=15), axis.title.y= element_text(size=15))


coef_Placenta_female_ITU_n
png(filename="Results/Figures/elasticNet_singleTissues/Outcome_add/sex_split/coef_Placenta_female.png",  width=2800, height=1400, res=400)
coef_Placenta_female_ITU_n
dev.off()
p1 <-
  csummary_Placenta_female_ITU_n %>%
  melt(id.vars = c("nzero", "mean_cvm", "median_cvm")) %>%
  ggplot2::ggplot(.) +
  ggplot2::theme_bw() +
  ggplot2::aes(x = nzero) +
  ggplot2::geom_point(mapping = ggplot2::aes(y = variable, size = value, alpha = value, color = value*100)) +
  ggplot2::scale_color_gradient2(high = 'green', mid = "purple", low = "black", midpoint =50)+
  ggplot2::scale_alpha(guide = 'none')+
  ggplot2::scale_size(guide = 'none')+
  ggplot2::scale_y_discrete(labels= c("birth weight", "birth length", "head circumference", "delivery mode (aided)", "induced labor (yes)", "parity (birth before)", "maternal age", "maternal BMI", "maternal hypertension (yes)", "maternal diabetes (yes)", "maternal mental disorders (yes)", "maternal smoking (yes)"))+
  ggplot2::scale_x_continuous(breaks=0:14, labels=)+
  ggplot2::labs(y="predictor", x = "\nnumber of non-zero coefficients", color="%")+
  ggplot2::theme(text = element_text(size = 17), axis.title.x= element_text(size=15), axis.title.y= element_text(size=15), legend.position = "none")
  
p2 <- 
coef_Placenta_female_ITU_n <- 
  ggplot(pm2_Placenta_female_ITU_n_coef, aes(y = variable, x=median))+
  geom_point(mapping = ggplot2::aes(y = variable, size =non_zero, alpha = non_zero, color = non_zero))+
  scale_color_gradient2(high = 'green', mid = "purple", low = "black", midpoint =50, limits=c(0,100))+
  scale_alpha(guide = 'none')+
  scale_size(guide = 'none')+
  geom_point()+
  geom_errorbar(aes(y = variable, xmin = lcl, xmax = ucl), width = 0.2)+
  labs(y="", x = "\nmedian & 95% CI of coefficient (over bootstraps)", color="%")+
  scale_x_continuous(limits=c(-0.4,0.4), breaks=c(-.4,-.3,-.2, -.1, 0, .1, .2, .3, .4))+
  scale_y_discrete(labels= c("birth weight", "birth length", "head circumference", "delivery mode (aided)", "induced labor (yes)", "parity (birth before)", "maternal age", "maternal BMI", "maternal hypertension (yes)", "maternal diabetes (yes)", "maternal mental disorders (yes)", "maternal smoking (yes)"))+
  geom_vline(xintercept=0, linetype="dashed")+
  theme_bw()+
  ggtitle("nzero = 7")+
  theme(text = element_text(size = 17), axis.title.x= element_text(size=15), axis.title.y= element_text(size=15), plot.title = element_text(size=15), axis.text.y=element_blank())

g1 <- ggplotGrob(p1)
g2 <- ggplotGrob(p2)
g <- cbind(g1, g2, size = "last")
g$heights <- unit.pmax(g1$heights, g2$heights)

png(filename="Results/Figures/elasticNet_singleTissues/Outcome_add/sex_split/Model_coef_Placenta_female.png", width=5800, height=1600, res=400)
grid.draw(g)
dev.off()

to the top

PREDO

Placenta elastic net

```r
# in case you want to start from here
load(\InputData/ClockCalculationsInput/Reg_Input_Data_Placenta_PREDO_EAAR_noNa_n.Rdata\)

<!-- rnb-source-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->




<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxueXJjX21hdF9QUkVET19QbGFjZW50YV9uIDwtIG1hdHJpeChSZWdfSW5wdXRfRGF0YV9QbGFjZW50YV9QUkVET19FQUFSX25vTmFfbiRFQUFSX0xlZSlcbnhyY19tYXRfUFJFRE9fUGxhY2VudGFfbiA8LSBtb2RlbC5tYXRyaXgoIH4gLiAtIEVBQVJfTGVlLCBkYXRhID0gUmVnX0lucHV0X0RhdGFfUGxhY2VudGFfUFJFRE9fRUFBUl9ub05hX24pWywgLTFdXG55cmNfbWF0X1BSRURPX3NjYWxlZF9QbGFjZW50YV9uIDwtIHNjYWxlKHlyY19tYXRfUFJFRE9fUGxhY2VudGFfbilcbnhyY19tYXRfUFJFRE9fc2NhbGVkX1BsYWNlbnRhX24gPC0gc2NhbGUoeHJjX21hdF9QUkVET19QbGFjZW50YV9uKVxuYGBgXG5gYGAifQ== -->

```r
```r
yrc_mat_PREDO_Placenta_n <- matrix(Reg_Input_Data_Placenta_PREDO_EAAR_noNa_n$EAAR_Lee)
xrc_mat_PREDO_Placenta_n <- model.matrix( ~ . - EAAR_Lee, data = Reg_Input_Data_Placenta_PREDO_EAAR_noNa_n)[, -1]
yrc_mat_PREDO_scaled_Placenta_n <- scale(yrc_mat_PREDO_Placenta_n)
xrc_mat_PREDO_scaled_Placenta_n <- scale(xrc_mat_PREDO_Placenta_n)

<!-- rnb-source-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->


<!-- set seed -->
<!-- ```{r} -->
<!-- set.seed(2020) -->
<!-- ``` -->


<!-- ```{r, warning=F} -->
<!--   nboot = 1000 -->

<!--   start_time <- Sys.time() -->
<!--   bootstraps_Placenta_PREDO_n <- replicate(nboot, { -->
<!--     rws <- sample(1:nrow(xrc_mat_PREDO_scaled_Placenta_n), replace = TRUE) -->
<!--     ensr(xrc_mat_PREDO_scaled_Placenta_n[rws, ], yrc_mat_PREDO_scaled_Placenta_n[rws, ], standardized = FALSE, family="gaussian", nlambda=100, nfolds=10, alpha=c(0.0,0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1.0)) -->
<!--   }, -->
<!--   simplify = FALSE) -->

<!--   end_time <- Sys.time() -->
<!--   end_time - start_time -->

<!--   #Time difference of 3.159319 hours -->

<!-- ``` -->

<!-- ```{r} -->
<!-- save(bootstraps_Placenta_PREDO_n, file="InputData/Data_ElasticNets/bootstraps_Placenta_PREDO_n_1000.Rdata") -->
<!-- ``` -->



<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxubG9hZChcXElucHV0RGF0YS9EYXRhX0VsYXN0aWNOZXRzL2Jvb3RzdHJhcHNfUGxhY2VudGFfUFJFRE9fbl8xMDAwLlJkYXRhXFwpXG5gYGBcbmBgYCJ9 -->

```r
```r
load(\InputData/Data_ElasticNets/bootstraps_Placenta_PREDO_n_1000.Rdata\)

<!-- rnb-source-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->




<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuc3VtbWFyaWVzX1BsYWNlbnRhX1BSRURPX24gPC1cbiAgYm9vdHN0cmFwc19QbGFjZW50YV9QUkVET19uICU+JVxuICBsYXBwbHkoc3VtbWFyeSkgJT4lXG4gIHJiaW5kbGlzdChpZGNvbCA9IFwiYm9vdHN0cmFwXCIpXG5cbnN1bW1hcmllc19QbGFjZW50YV9QUkVET19uXG5gYGAifQ== -->

```r
summaries_Placenta_PREDO_n <-
  bootstraps_Placenta_PREDO_n %>%
  lapply(summary) %>%
  rbindlist(idcol = "bootstrap")

summaries_Placenta_PREDO_n
summaries_Placenta_PREDO_n[, .SD[cvm == min(cvm)], by = c("bootstrap", "nzero")] %>%
  ggplot2::ggplot(data = .) +
  ggplot2::aes(x = nzero, y = cvm, group = bootstrap) +
  ggplot2::geom_point() +
  ggplot2::geom_line()
png(filename="Results/Figures/elasticNet_singleTissues/Outcome_main/bootstraps_Placenta_PREDO.png", width=800, height=600)
summaries_Placenta_PREDO_n[, .SD[cvm == min(cvm)], by = c("bootstrap", "nzero")] %>%
  ggplot2::ggplot(data = .) +
  ggplot2::aes(x = nzero, y = cvm, group = bootstrap) +
  ggplot2::geom_point() +
  ggplot2::geom_line()
dev.off()
```r
load(\InputData/Data_ElasticNets/pm2_Placenta_PREDO_n.Rdata\)
# coefficient values for the models with smallest cvm by number of non-erzo coefficients and bootstrap

<!-- rnb-source-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->




<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuY3N1bW1hcnlfUGxhY2VudGFfUFJFRE9fbiA8LSBSZWR1Y2UoZnVuY3Rpb24oeCx5KSBtZXJnZSh4ID0geCwgeSA9IHksIGJ5ID0gXCJuemVyb1wiKSwgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdChwbTJfUGxhY2VudGFfUFJFRE9fblssIGxhcHBseSguU0QsIGZ1bmN0aW9uKHgpIHttZWFuKHggIT0gMCl9KSwgLlNEY29scyA9IGMoXCJDaGlsZF9TZXhmZW1hbGVcIiwgXCJCaXJ0aF9XZWlnaHRcIiwgXCJCaXJ0aF9MZW5ndGhcIiwgXCJIZWFkX0NpcmN1bWZlcmVuY2VfYXRfQmlydGhcIiwgXCJEZWxpdmVyeV9Nb2RlX2RpY2hvdG9tYWlkZWRcIiwgXCJpbmR1Y2VkbGFib3VyWWVzXCIsIFwiUGFyaXR5X2RpY2hvdG9tZ2l2ZW4gYmlydGggYmVmb3JlXCIsIFwiTWF0ZXJuYWxfQWdlXzE4UG9wUmVnYW5kQlJcIiwgXCJNYXRlcm5hbF9QcmVwcmVnbmFuY3lCTUkxOG9jdDI4bmV3XCIsIFwibWF0ZXJuYWxfaHlwZXJ0ZW5zaW9uX2RpY2hvdG9taHlwZXJ0ZW5zaW9uIGluIGN1cnJlbnQgcHJlZ25hbmN5XCIsXCJtYXRlcm5hbF9kaWFiZXRlc19kaWNob3RvbWRpYWJldGVzIGluIGN1cnJlbnQgcHJlZ25hbmN5XCIsXCJNYXRlcm5hbF9NZW50YWxfRGlzb3JkZXJzX0J5X0NoaWxkYmlydGhZZXNcIixcInNtb2tpbmdfZGljaG90b215ZXNcIiksIGJ5ID0gbnplcm9dXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbTJfUGxhY2VudGFfUFJFRE9fblssIC4obWVhbl9jdm0gPSBtZWFuKGN2bSkpLCBieSA9IG56ZXJvXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBtMl9QbGFjZW50YV9QUkVET19uWywgLihtZWRpYW5fY3ZtID0gbWVkaWFuKGN2bSkpLCBieSA9IG56ZXJvXVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkpW29yZGVyKG56ZXJvKV1cblxuY3N1bW1hcnlfUGxhY2VudGFfUFJFRE9fblxuYGBgIn0= -->

```r
csummary_Placenta_PREDO_n <- Reduce(function(x,y) merge(x = x, y = y, by = "nzero"), 
                                     list(pm2_Placenta_PREDO_n[, lapply(.SD, function(x) {mean(x != 0)}), .SDcols = c("Child_Sexfemale", "Birth_Weight", "Birth_Length", "Head_Circumference_at_Birth", "Delivery_Mode_dichotomaided", "inducedlabourYes", "Parity_dichotomgiven birth before", "Maternal_Age_18PopRegandBR", "Maternal_PrepregnancyBMI18oct28new", "maternal_hypertension_dichotomhypertension in current pregnancy","maternal_diabetes_dichotomdiabetes in current pregnancy","Maternal_Mental_Disorders_By_ChildbirthYes","smoking_dichotomyes"), by = nzero]
                                          ,
                                          pm2_Placenta_PREDO_n[, .(mean_cvm = mean(cvm)), by = nzero],
                                          pm2_Placenta_PREDO_n[, .(median_cvm = median(cvm)), by = nzero]
                                     ))[order(nzero)]

csummary_Placenta_PREDO_n
g1_Placenta_PREDO_n <-
  csummary_Placenta_PREDO_n %>%
  melt(id.vars = c("nzero", "mean_cvm", "median_cvm")) %>%
  ggplot2::ggplot(.) +
  ggplot2::theme_bw() +
  ggplot2::aes(x = nzero) +
  ggplot2::geom_point(mapping = ggplot2::aes(y = variable, size = value, alpha = value, color = value*100)) +
  ggplot2::scale_color_gradient2(high = 'green', mid = "purple", low = "black", midpoint =50)+
  ggplot2::scale_alpha(guide = 'none')+
  ggplot2::scale_size(guide = 'none')+
  ggplot2::scale_y_discrete(labels= c("child sex", "birth weight", "birth length", "head circumference", "delivery mode", "induced labor", "parity", "maternal age", "maternal BMI", "maternal hypertension", "maternal diabetes", "maternal mental disorders", "maternal smoking"))+
  ggplot2::scale_x_continuous(breaks=0:14, labels=)+
  ggplot2::labs(y="predictor", x = "number of non-zero coefficients", color="%")+
  ggplot2::theme(text = element_text(size = 15), axis.title.x= element_text(size=15), axis.title.y= element_text(size=15))

g2_Placenta_PREDO_n <-
  csummary_Placenta_PREDO_n %>%
  ggplot2::ggplot(.) +
  ggplot2::theme_bw() +
  ggplot2::aes(x = nzero, y = median_cvm) +
  ggplot2::geom_point() + ggplot2::geom_line()+
  ggplot2::labs(y="median cvm", x = "number of non-zero coefficients")+
  ggplot2::scale_x_continuous(breaks=0:14, labels=)+
  ggplot2::theme(axis.text=element_text(size=15),axis.title=element_text(size=18))

gridExtra::grid.arrange(g1_Placenta_PREDO_n, g2_Placenta_PREDO_n, ncol = 1)
png(filename="Results/Figures/elasticNet_singleTissues/Outcome_main/bootstrapModels_Placenta_PREDO.png", width=2400, height=1800, res=300)
gridExtra::grid.arrange(g1_Placenta_PREDO_n, g2_Placenta_PREDO_n, ncol = 1)
dev.off()
png(filename="Results/Figures/elasticNet_singleTissues/Outcome_main/Model_Placenta_PREDO.png", width=2800, height=1400, res=400)
g1_Placenta_PREDO_n
dev.off()
elbow_finder(csummary_Placenta_PREDO_n$nzero, csummary_Placenta_PREDO_n$median_cvm)

nzero_indices_Placenta_PREDO <- data.frame(t(elbow_finder(csummary_Placenta_PREDO_n$nzero, csummary_Placenta_PREDO_n$median_cvm)))
colnames(nzero_indices_Placenta_PREDO) <- c("x", "y")
rownames(nzero_indices_Placenta_PREDO) <- NULL
```r
nzero_final_placenta_predo <- 6

<!-- rnb-source-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->




<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuY3N1bW1hcnlfUGxhY2VudGFfUFJFRE9fbltuemVybyAlaW4lIG56ZXJvX2ZpbmFsX3BsYWNlbnRhX3ByZWRvXVxuYGBgIn0= -->

```r
csummary_Placenta_PREDO_n[nzero %in% nzero_final_placenta_predo]
nonzero_choose_Placenta_PREDO <- ggplot2::ggplot(csummary_Placenta_PREDO_n) +
  ggplot2::theme_bw()+
  ggplot2::aes(x = nzero, y = median_cvm) +
  ggplot2::scale_x_continuous(breaks=c(0:17))+
  ggplot2::geom_point() + ggplot2::geom_line()+
  ggplot2::geom_point(data=nzero_indices_Placenta_PREDO, aes(x=x, y=y), colour="red", size=2)+
  ggplot2::ylab("median of minimum cross-validation errors over bootstraps")+
  ggplot2::xlab("number of non-zero coefficients")+
  ggplot2::geom_segment(aes(x = nzero[1], y = median_cvm[1], xend = nzero[14], yend = median_cvm[14], colour = "segment"), data = csummary_Placenta_PREDO_n, show.legend = F)

nonzero_choose_Placenta_PREDO
png(filename="Results/Figures/elasticNet_singleTissues/Outcome_main/nzero_choose_Placenta_PREDO.png", width=1600, height=1400, res=300)
nonzero_choose_Placenta_PREDO
dev.off()
```r
summary_Placenta_PREDO_n_finalnzero <- csummary_Placenta_PREDO_n[nzero %in% nzero_final_placenta_predo]
sig_var_names_Placenta_PREDO_n_finalnzero <- Filter(function(x) any(x > 0.75), summary_Placenta_PREDO_n_finalnzero[,!c(\nzero\, \mean_cvm\, \median_cvm\)]) %>% colnames()
colnames(summary_Placenta_PREDO_n_finalnzero) <- c(\non-zero\,\child sex\, \birth weight\, \birth length\, \head circumference\, \delivery mode (aided)\, \induced labor (yes)\, \parity (birth before)\, \maternal age\, \maternal BMI\, \maternal hypertension (yes)\, \maternal diabetes (yes)\, \maternal mental disorders (yes)\, \maternal smoking (yes)\, \mean cvm\, \median cvm\)
summary_Placenta_PREDO_n_finalnzeroT <- as.data.frame(t(summary_Placenta_PREDO_n_finalnzero[,-c(\non-zero\, \median cvm\, \mean cvm\)]))
summary_Placenta_PREDO_n_finalnzeroT$variable <- rownames(summary_Placenta_PREDO_n_finalnzeroT)
rownames(summary_Placenta_PREDO_n_finalnzeroT) <- NULL
names(summary_Placenta_PREDO_n_finalnzeroT)[names(summary_Placenta_PREDO_n_finalnzeroT) == 'V1'] <- 'percent'
summary_Placenta_PREDO_n_finalnzeroT <- summary_Placenta_PREDO_n_finalnzeroT[order(summary_Placenta_PREDO_n_finalnzeroT$percent),]

summary_Placenta_PREDO_n_finalnzeroT$number <- seq(1, length(summary_Placenta_PREDO_n_finalnzeroT$variable))

<!-- rnb-source-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->



<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxucGVyY192YXJzX1BsYWNlbnRhX1BSRURPX24gPC0gXG4gIGdncGxvdChzdW1tYXJ5X1BsYWNlbnRhX1BSRURPX25fZmluYWxuemVyb1QsIGFlcyhyZW9yZGVyKHZhcmlhYmxlLCBwZXJjZW50KSwgcGVyY2VudCwgZ3JvdXA9MSkpK1xuICBnZW9tX3BvaW50KCkrIGdlb21fbGluZSgpK1xuICB5bGFiKFwiJSBvY2N1cmVuY2UgaW4gbW9kZWxzIHdpdGggbnplcm8gY29lZmZpY2llbnRzID0gNVwiKStcbiAgc2NhbGVfeV9jb250aW51b3VzKGJyZWFrcz1jKDAuMSwwLjIsMC4zLDAuNCwwLjUsMC42LDAuNywwLjgsMC45KSkrXG4gIHhsYWIoXCJ2YXJpYWJsZVwiKStcbiAgY29vcmRfZmxpcCgpK1xuICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQ9MC43NSwgbGluZXR5cGU9XCJkb3R0ZWRcIikrXG4gIHRoZW1lX2J3KClcblxucGVyY192YXJzX1BsYWNlbnRhX1BSRURPX25cblxuIyBkZWNpZGUgZm9yIGN1dC1vZmYgJSAtPiBoZXJlIC43NVxuXG5GaWx0ZXIoZnVuY3Rpb24oeCkgYW55KHggPiAwLjc1KSwgc3VtbWFyeV9QbGFjZW50YV9QUkVET19uX2ZpbmFsbnplcm9bLCFjKFwibm9uLXplcm9cIiwgXCJtZWFuIGN2bVwiLCBcIm1lZGlhbiBjdm1cIildKVxuXG5gYGAifQ== -->

```r
perc_vars_Placenta_PREDO_n <- 
  ggplot(summary_Placenta_PREDO_n_finalnzeroT, aes(reorder(variable, percent), percent, group=1))+
  geom_point()+ geom_line()+
  ylab("% occurence in models with nzero coefficients = 5")+
  scale_y_continuous(breaks=c(0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9))+
  xlab("variable")+
  coord_flip()+
  geom_hline(yintercept=0.75, linetype="dotted")+
  theme_bw()

perc_vars_Placenta_PREDO_n

# decide for cut-off % -> here .75

Filter(function(x) any(x > 0.75), summary_Placenta_PREDO_n_finalnzero[,!c("non-zero", "mean cvm", "median cvm")])
png(filename="Results/Figures/elasticNet_singleTissues/Outcome_main/varsPercent_Placenta_PREDO.png", width=1100, height=1400, res=400)
perc_vars_Placenta_PREDO_n
dev.off()
pm2_Placenta_PREDO_n_coef <-
  dcast(pm2_Placenta_PREDO_n[,
                                as.list(unlist(
                                  lapply(.SD,
                                         function(x) {
                                           y <- unname(quantile(x[x != 0], probs = c(0.025, 0.975)))
                                           list("non_zero" = 100 * mean(x != 0),
                                                lcl = y[1],
                                                ucl = y[2],
                                                width = diff(y),
                                                median = median(x[x!= 0]))
                                         }))),
                                .SDcols = c("Child_Sexfemale", "Birth_Weight", "Birth_Length", "Head_Circumference_at_Birth", "Delivery_Mode_dichotomaided", "inducedlabourYes", "Parity_dichotomgiven birth before", "Maternal_Age_18PopRegandBR", "Maternal_PrepregnancyBMI18oct28new", "maternal_hypertension_dichotomhypertension in current pregnancy","maternal_diabetes_dichotomdiabetes in current pregnancy","Maternal_Mental_Disorders_By_ChildbirthYes","smoking_dichotomyes"),
                                by = nzero][order(nzero)] %>%
          melt(id.var = "nzero") %>%
          .[, metric := sub("^.+\\.(.+)$", "\\1", variable)] %>%
          .[, variable := sub("^(.+)\\..+$", "\\1", variable)] %>%
          .[nzero ==nzero_final_placenta_predo], nzero+ variable ~ metric, value.var="value")

# get desired order of predictors
pm2_Placenta_PREDO_n_coef <-
  pm2_Placenta_PREDO_n_coef[match(c("Child_Sexfemale", "Birth_Weight", "Birth_Length", "Head_Circumference_at_Birth", "Delivery_Mode_dichotomaided", "inducedlabourYes", "Parity_dichotomgiven birth before", "Maternal_Age_18PopRegandBR", "Maternal_PrepregnancyBMI18oct28new", "maternal_hypertension_dichotomhypertension in current pregnancy","maternal_diabetes_dichotomdiabetes in current pregnancy","Maternal_Mental_Disorders_By_ChildbirthYes","smoking_dichotomyes"), pm2_Placenta_PREDO_n_coef$variable),]
pm2_Placenta_PREDO_n_coef$variable <- factor(pm2_Placenta_PREDO_n_coef$variabl, levels=unique(pm2_Placenta_PREDO_n_coef$variable))

## NOTE: median is used here instead of mean
# make frame for only significant variables:
pm2_Placenta_PREDO_n_datable <- dcast(pm2_Placenta_PREDO_n[,
                                                                 as.list(unlist(
                                                                   lapply(.SD,
                                                                          function(x) {
                                                                            y <- unname(quantile(x[x != 0], probs = c(0.025, 0.975)))
                                                                            list("non_zero" = 100 * mean(x != 0),
                                                                                 lcl = y[1],
                                                                                 ucl = y[2],
                                                                                 width = diff(y),
                                                                                 median = median(x[x!= 0]))
                                                                          }))),
                                                                 .SDcols = c("Child_Sexfemale", "Birth_Weight", "Birth_Length", "Head_Circumference_at_Birth", "Delivery_Mode_dichotomaided", "inducedlabourYes", "Parity_dichotomgiven birth before", "Maternal_Age_18PopRegandBR", "Maternal_PrepregnancyBMI18oct28new", "maternal_hypertension_dichotomhypertension in current pregnancy","maternal_diabetes_dichotomdiabetes in current pregnancy","Maternal_Mental_Disorders_By_ChildbirthYes","smoking_dichotomyes"),
                                                                 by = nzero][order(nzero)] %>%
                                           melt(id.var = "nzero") %>%
                                           .[, metric := sub("^.+\\.(.+)$", "\\1", variable)] %>%
                                           .[, variable := sub("^(.+)\\..+$", "\\1", variable)] %>%
                                           # print %>%
                                           .[nzero == nzero_final_placenta_predo & variable %in% sig_var_names_Placenta_PREDO_n_finalnzero], nzero+ variable ~ metric, value.var="value")
pm2_Placenta_PREDO_n_coef
```r
write_xlsx(pm2_Placenta_PREDO_n_coef,\Results/Tables/CoefficientsModel_Placenta_PREDO.xlsx\)

<!-- rnb-source-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->



<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxuc2lnX3ZhcnNfUGxhY2VudGFfUFJFRE9fbiA8LVxuICBwbTJfUGxhY2VudGFfUFJFRE9fbl9jb2VmICU+JVxuICBnZ3Bsb3QyOjpnZ3Bsb3QoLikgK1xuICBnZ3Bsb3QyOjp0aGVtZV9idygpICtcbiAgZ2dwbG90Mjo6dGhlbWUoYXhpcy50ZXh0Lng9ZWxlbWVudF9ibGFuaygpKStcbiAgZ2dwbG90Mjo6YWVzKHg9XFxuemVyb1xcKStcbiAgZ2dwbG90Mjo6Z2VvbV9wb2ludChtYXBwaW5nID0gZ2dwbG90Mjo6YWVzKHkgPSB2YXJpYWJsZSwgc2l6ZSA9bm9uX3plcm8sIGFscGhhID0gbm9uX3plcm8sIGNvbG9yID0gbm9uX3plcm8pKSArXG4gIGdncGxvdDI6Omdlb21fdGV4dChhZXMoeT12YXJpYWJsZSwgbGFiZWw9c3ByaW50ZihcXCUwLjJmXFwsIHJvdW5kKG1lZGlhbiwgZGlnaXRzPTIpKSwgc2l6ZT01MCksaGp1c3Q9MCwgdmp1c3Q9MC41LCBudWRnZV94ID0gMC4xKStcbiAgZ2dwbG90Mjo6c2NhbGVfY29sb3JfZ3JhZGllbnQyKGhpZ2ggPSAnZ3JlZW4nLCBtaWQgPSBcXHB1cnBsZVxcLCBsb3cgPSBcXGJsYWNrXFwsIG1pZHBvaW50ID01MCkrXG4gIGdncGxvdDI6OnNjYWxlX2FscGhhKGd1aWRlID0gJ25vbmUnKStcbiAgZ2dwbG90Mjo6c2NhbGVfc2l6ZShndWlkZSA9ICdub25lJykrXG4gIGdncGxvdDI6OnNjYWxlX3lfZGlzY3JldGUobGFiZWxzPSBjKFxcY2hpbGQgc2V4XFwsIFxcYmlydGggd2VpZ2h0XFwsIFxcYmlydGggbGVuZ3RoXFwsIFxcaGVhZCBjaXJjdW1mZXJlbmNlXFwsIFxcZGVsaXZlcnkgbW9kZSAoYWlkZWQpXFwsIFxcaW5kdWNlZCBsYWJvciAoeWVzKVxcLCBcXHBhcml0eSAoYmlydGggYmVmb3JlKVxcLCBcXG1hdGVybmFsIGFnZVxcLCBcXG1hdGVybmFsIEJNSVxcLCBcXG1hdGVybmFsIGh5cGVydGVuc2lvbiAoeWVzKVxcLCBcXG1hdGVybmFsIGRpYWJldGVzICh5ZXMpXFwsIFxcbWF0ZXJuYWwgbWVudGFsIGRpc29yZGVycyAoeWVzKVxcLCBcXG1hdGVybmFsIHNtb2tpbmcgKHllcylcXCkpK1xuICBnZ3Bsb3QyOjpsYWJzKHk9XFxwcmVkaWN0b3JcXCwgeCA9IFxcbnVtYmVyIG9mIG5vbi16ZXJvIGNvZWZmaWNpZW50cyA9IDVcXCwgY29sb3I9XFwlXFwpXG5cbmBgYFxuYGBgIn0= -->

```r
```r
sig_vars_Placenta_PREDO_n <-
  pm2_Placenta_PREDO_n_coef %>%
  ggplot2::ggplot(.) +
  ggplot2::theme_bw() +
  ggplot2::theme(axis.text.x=element_blank())+
  ggplot2::aes(x=\nzero\)+
  ggplot2::geom_point(mapping = ggplot2::aes(y = variable, size =non_zero, alpha = non_zero, color = non_zero)) +
  ggplot2::geom_text(aes(y=variable, label=sprintf(\%0.2f\, round(median, digits=2)), size=50),hjust=0, vjust=0.5, nudge_x = 0.1)+
  ggplot2::scale_color_gradient2(high = 'green', mid = \purple\, low = \black\, midpoint =50)+
  ggplot2::scale_alpha(guide = 'none')+
  ggplot2::scale_size(guide = 'none')+
  ggplot2::scale_y_discrete(labels= c(\child sex\, \birth weight\, \birth length\, \head circumference\, \delivery mode (aided)\, \induced labor (yes)\, \parity (birth before)\, \maternal age\, \maternal BMI\, \maternal hypertension (yes)\, \maternal diabetes (yes)\, \maternal mental disorders (yes)\, \maternal smoking (yes)\))+
  ggplot2::labs(y=\predictor\, x = \number of non-zero coefficients = 5\, color=\%\)

<!-- rnb-source-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->



<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuY29lZl9QbGFjZW50YV9QUkVET19uIDwtIFxuICBnZ3Bsb3QocG0yX1BsYWNlbnRhX1BSRURPX25fY29lZiwgYWVzKHkgPSB2YXJpYWJsZSwgeD1tZWRpYW4pKStcbiAgZ2VvbV9wb2ludChtYXBwaW5nID0gZ2dwbG90Mjo6YWVzKHkgPSB2YXJpYWJsZSwgc2l6ZSA9bm9uX3plcm8sIGFscGhhID0gbm9uX3plcm8sIGNvbG9yID0gbm9uX3plcm8pKStcbiAgc2NhbGVfY29sb3JfZ3JhZGllbnQyKGhpZ2ggPSAnZ3JlZW4nLCBtaWQgPSBcInB1cnBsZVwiLCBsb3cgPSBcImJsYWNrXCIsIG1pZHBvaW50ID01MCwgbGltaXRzPWMoMCwxMDApKStcbiAgc2NhbGVfYWxwaGEoZ3VpZGUgPSAnbm9uZScpK1xuICBzY2FsZV9zaXplKGd1aWRlID0gJ25vbmUnKStcbiAgZ2VvbV9wb2ludCgpK1xuICBnZW9tX2Vycm9yYmFyKGFlcyh5ID0gdmFyaWFibGUsIHhtaW4gPSBsY2wsIHhtYXggPSB1Y2wpLCB3aWR0aCA9IDAuMikrXG4gIGxhYnMoeT1cInByZWRpY3RvclwiLCB4ID0gXCJcXG5tZWRpYW4gJiA5NSUgQ0kgb2YgY29lZmZpY2llbnQgKG92ZXIgYm9vdHN0cmFwcylcIiwgY29sb3I9XCIlXCIpK1xuICBzY2FsZV94X2NvbnRpbnVvdXMobGltaXRzPWMoLTAuNSwwLjQpLCBicmVha3M9YygtLjQsLS4zLC0uMiwgLS4xLCAwLCAuMSwgLjIsIC4zLCAuNCkpK1xuICBzY2FsZV95X2Rpc2NyZXRlKGxhYmVscz0gYyhcImNoaWxkIHNleCAoZmVtYWxlKVwiLCBcImJpcnRoIHdlaWdodFwiLCBcImJpcnRoIGxlbmd0aFwiLCBcImhlYWQgY2lyY3VtZmVyZW5jZVwiLCBcImRlbGl2ZXJ5IG1vZGUgKGFpZGVkKVwiLCBcImluZHVjZWQgbGFib3IgKHllcylcIiwgXCJwYXJpdHkgKGJpcnRoIGJlZm9yZSlcIiwgXCJtYXRlcm5hbCBhZ2VcIiwgXCJtYXRlcm5hbCBCTUlcIiwgXCJtYXRlcm5hbCBoeXBlcnRlbnNpb24gKHllcylcIiwgXCJtYXRlcm5hbCBkaWFiZXRlcyAoeWVzKVwiLCBcIm1hdGVybmFsIG1lbnRhbCBkaXNvcmRlcnMgKHllcylcIiwgXCJtYXRlcm5hbCBzbW9raW5nICh5ZXMpXCIpKStcbiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0PTAsIGxpbmV0eXBlPVwiZGFzaGVkXCIpK1xuICB0aGVtZV9idygpK1xuICB0aGVtZSh0ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNSksIGF4aXMudGl0bGUueD0gZWxlbWVudF90ZXh0KHNpemU9MTUpLCBheGlzLnRpdGxlLnk9IGVsZW1lbnRfdGV4dChzaXplPTE1KSlcblxuXG5jb2VmX1BsYWNlbnRhX1BSRURPX25cbmBgYCJ9 -->

```r
coef_Placenta_PREDO_n <- 
  ggplot(pm2_Placenta_PREDO_n_coef, aes(y = variable, x=median))+
  geom_point(mapping = ggplot2::aes(y = variable, size =non_zero, alpha = non_zero, color = non_zero))+
  scale_color_gradient2(high = 'green', mid = "purple", low = "black", midpoint =50, limits=c(0,100))+
  scale_alpha(guide = 'none')+
  scale_size(guide = 'none')+
  geom_point()+
  geom_errorbar(aes(y = variable, xmin = lcl, xmax = ucl), width = 0.2)+
  labs(y="predictor", x = "\nmedian & 95% CI of coefficient (over bootstraps)", color="%")+
  scale_x_continuous(limits=c(-0.5,0.4), breaks=c(-.4,-.3,-.2, -.1, 0, .1, .2, .3, .4))+
  scale_y_discrete(labels= c("child sex (female)", "birth weight", "birth length", "head circumference", "delivery mode (aided)", "induced labor (yes)", "parity (birth before)", "maternal age", "maternal BMI", "maternal hypertension (yes)", "maternal diabetes (yes)", "maternal mental disorders (yes)", "maternal smoking (yes)"))+
  geom_vline(xintercept=0, linetype="dashed")+
  theme_bw()+
  theme(text = element_text(size = 15), axis.title.x= element_text(size=15), axis.title.y= element_text(size=15))


coef_Placenta_PREDO_n
png(filename="Results/Figures/elasticNet_singleTissues/Outcome_main/coef_Placenta_PREDO.png", width=2800, height=1400, res=400)
coef_Placenta_PREDO_n
dev.off()
p1 <-
  csummary_Placenta_PREDO_n %>%
  melt(id.vars = c("nzero", "mean_cvm", "median_cvm")) %>%
  ggplot2::ggplot(.) +
  ggplot2::theme_bw() +
  ggplot2::aes(x = nzero) +
  ggplot2::geom_point(mapping = ggplot2::aes(y = variable, size = value, alpha = value, color = value*100)) +
  ggplot2::scale_color_gradient2(high = 'green', mid = "purple", low = "black", midpoint =50)+
  ggplot2::scale_alpha(guide = 'none')+
  ggplot2::scale_size(guide = 'none')+
  ggplot2::scale_y_discrete(labels= c("child sex (female)", "birth weight", "birth length", "head circumference", "delivery mode (aided)", "induced labor (yes)", "parity (birth before)", "maternal age", "maternal BMI", "maternal hypertension (yes)", "maternal diabetes (yes)", "maternal mental disorders (yes)", "maternal smoking (yes)"))+
  ggplot2::scale_x_continuous(breaks=0:14, labels=)+
  ggplot2::labs(y="predictor", x = "\nnumber of non-zero coefficients", color="%")+
  ggplot2::theme(text = element_text(size = 17), axis.title.x= element_text(size=15), axis.title.y= element_text(size=15), legend.position = "none")
  
p2 <- 
  ggplot(pm2_Placenta_PREDO_n_coef, aes(y = variable, x=median))+
  geom_point(mapping = ggplot2::aes(y = variable, size =non_zero, alpha = non_zero, color = non_zero))+
  scale_color_gradient2(high = 'green', mid = "purple", low = "black", midpoint =50, limits=c(0,100))+
  scale_alpha(guide = 'none')+
  scale_size(guide = 'none')+
  geom_point()+
  geom_errorbar(aes(y = variable, xmin = lcl, xmax = ucl), width = 0.2)+
  labs(y="", x = "\nmedian & 95% CI of coefficient (over bootstraps)", color="%")+
  scale_x_continuous(limits=c(-0.5,0.4), breaks=c(-.4,-.3,-.2, -.1, 0, .1, .2, .3, .4))+
  scale_y_discrete(labels= c("child sex (female)", "birth weight", "birth length", "head circumference", "delivery mode (aided)", "induced labor (yes)", "parity (birth before)", "maternal age", "maternal BMI", "maternal hypertension (yes)", "maternal diabetes (yes)", "maternal mental disorders (yes)", "maternal smoking (yes)"))+
  geom_vline(xintercept=0, linetype="dashed")+
  theme_bw()+
  ggtitle("nzero = 6")+
  theme(text = element_text(size = 17), axis.title.x= element_text(size=15), axis.title.y= element_text(size=15), plot.title = element_text(size=15), axis.text.y=element_blank())

g1 <- ggplotGrob(p1)
g2 <- ggplotGrob(p2)
g <- cbind(g1, g2, size = "last")
g$heights <- unit.pmax(g1$heights, g2$heights)

png(filename="Results/Figures/elasticNet_singleTissues/Outcome_main/Model_coef_Placenta_PREDO.png", width=5800, height=1600, res=400)
grid.draw(g)
dev.off()

to the top

Placenta elastic net

```r
# in case you want to start from here
load(\InputData/ClockCalculationsInput/Reg_Input_Data_Placenta_PREDO_EAAR_noNa_wa.Rdata\)

<!-- rnb-source-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->



<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxueXJjX21hdF9QUkVET19QbGFjZW50YV93YSA8LSBtYXRyaXgoUmVnX0lucHV0X0RhdGFfUGxhY2VudGFfUFJFRE9fRUFBUl9ub05hX3dhJEVBQVJfTGVlKVxueHJjX21hdF9QUkVET19QbGFjZW50YV93YSA8LSBtb2RlbC5tYXRyaXgoIH4gLiAtIEVBQVJfTGVlLCBkYXRhID0gUmVnX0lucHV0X0RhdGFfUGxhY2VudGFfUFJFRE9fRUFBUl9ub05hX3dhKVssIC0xXVxueXJjX21hdF9QUkVET19zY2FsZWRfUGxhY2VudGFfd2EgPC0gc2NhbGUoeXJjX21hdF9QUkVET19QbGFjZW50YV93YSlcbnhyY19tYXRfUFJFRE9fc2NhbGVkX1BsYWNlbnRhX3dhIDwtIHNjYWxlKHhyY19tYXRfUFJFRE9fUGxhY2VudGFfd2EpXG5gYGBcbmBgYCJ9 -->

```r
```r
yrc_mat_PREDO_Placenta_wa <- matrix(Reg_Input_Data_Placenta_PREDO_EAAR_noNa_wa$EAAR_Lee)
xrc_mat_PREDO_Placenta_wa <- model.matrix( ~ . - EAAR_Lee, data = Reg_Input_Data_Placenta_PREDO_EAAR_noNa_wa)[, -1]
yrc_mat_PREDO_scaled_Placenta_wa <- scale(yrc_mat_PREDO_Placenta_wa)
xrc_mat_PREDO_scaled_Placenta_wa <- scale(xrc_mat_PREDO_Placenta_wa)

<!-- rnb-source-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->


<!-- set seed -->
<!-- ```{r} -->
<!-- set.seed(2020) -->
<!-- ``` -->


<!-- ```{r, warning=F} -->
<!--   nboot = 1000 -->

<!--   start_time <- Sys.time() -->
<!--   bootstraps_Placenta_PREDO_wa <- replicate(nboot, { -->
<!--     rws <- sample(1:nrow(xrc_mat_PREDO_scaled_Placenta_wa), replace = TRUE) -->
<!--     ensr(xrc_mat_PREDO_scaled_Placenta_wa[rws, ], yrc_mat_PREDO_scaled_Placenta_wa[rws, ], standardized = FALSE, family="gaussian", nlambda=100, nfolds=10, alpha=c(0.0,0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1.0)) -->
<!--   }, -->
<!--   simplify = FALSE) -->

<!--   end_time <- Sys.time() -->
<!--   end_time - start_time -->

<!--   #Time difference of 3.159319 hours -->

<!-- ``` -->

<!-- ```{r} -->
<!-- save(bootstraps_Placenta_PREDO_wa, file="InputData/Data_ElasticNets/bootstraps_Placenta_PREDO_wa_1000.Rdata") -->
<!-- ``` -->



<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxubG9hZChcXElucHV0RGF0YS9EYXRhX0VsYXN0aWNOZXRzL2Jvb3RzdHJhcHNfUGxhY2VudGFfUFJFRE9fd2FfMTAwMC5SZGF0YVxcKVxuYGBgXG5gYGAifQ== -->

```r
```r
load(\InputData/Data_ElasticNets/bootstraps_Placenta_PREDO_wa_1000.Rdata\)

<!-- rnb-source-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->



<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuc3VtbWFyaWVzX1BsYWNlbnRhX1BSRURPX3dhIDwtXG4gIGJvb3RzdHJhcHNfUGxhY2VudGFfUFJFRE9fd2EgJT4lXG4gIGxhcHBseShzdW1tYXJ5KSAlPiVcbiAgcmJpbmRsaXN0KGlkY29sID0gXCJib290c3RyYXBcIilcblxuc3VtbWFyaWVzX1BsYWNlbnRhX1BSRURPX3dhXG5gYGAifQ== -->

```r
summaries_Placenta_PREDO_wa <-
  bootstraps_Placenta_PREDO_wa %>%
  lapply(summary) %>%
  rbindlist(idcol = "bootstrap")

summaries_Placenta_PREDO_wa
summaries_Placenta_PREDO_wa[, .SD[cvm == min(cvm)], by = c("bootstrap", "nzero")] %>%
  ggplot2::ggplot(data = .) +
  ggplot2::aes(x = nzero, y = cvm, group = bootstrap) +
  ggplot2::geom_point() +
  ggplot2::geom_line()
```r
png(filename=\Results/Figures/elasticNet_singleTissues/Outcome_add/alcohol/bootstraps_Placenta_PREDO.png\, width=800, height=600)
summaries_Placenta_PREDO_wa[, .SD[cvm == min(cvm)], by = c(\bootstrap\, \nzero\)] %>%
  ggplot2::ggplot(data = .) +
  ggplot2::aes(x = nzero, y = cvm, group = bootstrap) +
  ggplot2::geom_point() +
  ggplot2::geom_line()
dev.off()

<!-- rnb-source-end -->

<!-- rnb-output-begin eyJkYXRhIjoibnVsbCBkZXZpY2UgXG4gICAgICAgICAgMSBcbiJ9 -->

null device 1




<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->



<!-- ```{r, warning=FALSE} -->
<!-- # lowest cvm by bootstrap and nzero -->
<!-- pm_Placenta_PREDO_wa <- summaries_Placenta_PREDO_wa[, .SD[cvm == min(cvm)], by = c("bootstrap", "nzero")] -->
<!-- pm2_Placenta_PREDO_wa <- NULL -->

<!-- for(i in as.integer(seq(1, nrow(pm_Placenta_PREDO_wa), by = 1))) { -->
<!--   pm2_Placenta_PREDO_wa <- rbind(pm2_Placenta_PREDO_wa, -->
<!--                cbind(pm_Placenta_PREDO_wa[i, ], -->
<!--                t(as.matrix(coef(bootstraps_Placenta_PREDO_wa[[pm_Placenta_PREDO_wa[i, bootstrap]]][[pm_Placenta_PREDO_wa[i, l_index]]], s = pm_Placenta_PREDO_wa[i, lambda]))) -->
<!--                ) -->
<!--   ) -->
<!-- } -->

<!-- pm2_Placenta_PREDO_wa -->
<!-- ``` -->


<!-- ```{r} -->
<!-- # save "preferable models" -->
<!-- save(pm2_Placenta_PREDO_wa, file="InputData/Data_ElasticNets/pm2_Placenta_PREDO_wa.Rdata") -->
<!-- ``` -->



<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxubG9hZChcXElucHV0RGF0YS9EYXRhX0VsYXN0aWNOZXRzL3BtMl9QbGFjZW50YV9QUkVET193YS5SZGF0YVxcKVxuIyBjb2VmZmljaWVudCB2YWx1ZXMgZm9yIHRoZSBtb2RlbHMgd2l0aCBzbWFsbGVzdCBjdm0gYnkgbnVtYmVyIG9mIG5vbi1lcnpvIGNvZWZmaWNpZW50cyBhbmQgYm9vdHN0cmFwXG5gYGBcbmBgYCJ9 -->

```r
```r
load(\InputData/Data_ElasticNets/pm2_Placenta_PREDO_wa.Rdata\)
# coefficient values for the models with smallest cvm by number of non-erzo coefficients and bootstrap

<!-- rnb-source-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->


look how often a particular variable is associated with a non-zero coefficient in a model with a given number of non-zero coefficients (over all bootstraps)


<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuY3N1bW1hcnlfUGxhY2VudGFfUFJFRE9fd2EgPC0gUmVkdWNlKGZ1bmN0aW9uKHgseSkgbWVyZ2UoeCA9IHgsIHkgPSB5LCBieSA9IFwibnplcm9cIiksIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdChwbTJfUGxhY2VudGFfUFJFRE9fd2FbLCBsYXBwbHkoLlNELCBmdW5jdGlvbih4KSB7bWVhbih4ICE9IDApfSksIC5TRGNvbHMgPSBjKFwiQ2hpbGRfU2V4ZmVtYWxlXCIsIFwiQmlydGhfV2VpZ2h0XCIsIFwiQmlydGhfTGVuZ3RoXCIsIFwiSGVhZF9DaXJjdW1mZXJlbmNlX2F0X0JpcnRoXCIsIFwiRGVsaXZlcnlfTW9kZV9kaWNob3RvbWFpZGVkXCIsIFwiaW5kdWNlZGxhYm91clllc1wiLCBcIlBhcml0eV9kaWNob3RvbWdpdmVuIGJpcnRoIGJlZm9yZVwiLCBcIk1hdGVybmFsX0FnZV8xOFBvcFJlZ2FuZEJSXCIsIFwiTWF0ZXJuYWxfUHJlcHJlZ25hbmN5Qk1JMThvY3QyOG5ld1wiLCBcIm1hdGVybmFsX2h5cGVydGVuc2lvbl9kaWNob3RvbWh5cGVydGVuc2lvbiBpbiBjdXJyZW50IHByZWduYW5jeVwiLFwibWF0ZXJuYWxfZGlhYmV0ZXNfZGljaG90b21kaWFiZXRlcyBpbiBjdXJyZW50IHByZWduYW5jeVwiLFwiTWF0ZXJuYWxfTWVudGFsX0Rpc29yZGVyc19CeV9DaGlsZGJpcnRoWWVzXCIsXCJzbW9raW5nX2RpY2hvdG9teWVzXCIsIFwiQWxjb2hvbF9Vc2VfSW5fRWFybHlfUHJlZ25hbmN5XzE5T2N0eWVzXCIpLCBieSA9IG56ZXJvXVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBtMl9QbGFjZW50YV9QUkVET193YVssIC4obWVhbl9jdm0gPSBtZWFuKGN2bSkpLCBieSA9IG56ZXJvXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG0yX1BsYWNlbnRhX1BSRURPX3dhWywgLihtZWRpYW5fY3ZtID0gbWVkaWFuKGN2bSkpLCBieSA9IG56ZXJvXVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSlbb3JkZXIobnplcm8pXVxuXG5jc3VtbWFyeV9QbGFjZW50YV9QUkVET193YVxuYGBgIn0= -->

```r
csummary_Placenta_PREDO_wa <- Reduce(function(x,y) merge(x = x, y = y, by = "nzero"), 
                                       list(pm2_Placenta_PREDO_wa[, lapply(.SD, function(x) {mean(x != 0)}), .SDcols = c("Child_Sexfemale", "Birth_Weight", "Birth_Length", "Head_Circumference_at_Birth", "Delivery_Mode_dichotomaided", "inducedlabourYes", "Parity_dichotomgiven birth before", "Maternal_Age_18PopRegandBR", "Maternal_PrepregnancyBMI18oct28new", "maternal_hypertension_dichotomhypertension in current pregnancy","maternal_diabetes_dichotomdiabetes in current pregnancy","Maternal_Mental_Disorders_By_ChildbirthYes","smoking_dichotomyes", "Alcohol_Use_In_Early_Pregnancy_19Octyes"), by = nzero]
                                            ,
                                            pm2_Placenta_PREDO_wa[, .(mean_cvm = mean(cvm)), by = nzero],
                                            pm2_Placenta_PREDO_wa[, .(median_cvm = median(cvm)), by = nzero]
                                       ))[order(nzero)]

csummary_Placenta_PREDO_wa
g1_Placenta_PREDO_wa <-
  csummary_Placenta_PREDO_wa %>%
  melt(id.vars = c("nzero", "mean_cvm", "median_cvm")) %>%
  ggplot2::ggplot(.) +
  ggplot2::theme_bw() +
  ggplot2::aes(x = nzero) +
  ggplot2::geom_point(mapping = ggplot2::aes(y = variable, size = value, alpha = value, color = value*100)) +
  ggplot2::scale_color_gradient2(high = 'green', mid = "purple", low = "black", midpoint =50)+
  ggplot2::scale_alpha(guide = 'none')+
  ggplot2::scale_size(guide = 'none')+
  ggplot2::scale_y_discrete(labels= c("child sex","birth weight", "birth length", "head circumference", "delivery mode", "induced labor", "parity", "maternal age", "maternal BMI", "maternal hypertension", "maternal diabetes", "maternal mental disorders", "maternal smoking", "maternal alcohol use"))+
  ggplot2::scale_x_continuous(breaks=0:14, labels=)+
  ggplot2::labs(y="predictor", x = "number of non-zero coefficients", color="%")+
  ggplot2::theme(text = element_text(size = 15), axis.title.x= element_text(size=15), axis.title.y= element_text(size=15))

g2_Placenta_PREDO_wa <-
  csummary_Placenta_PREDO_wa %>%
  ggplot2::ggplot(.) +
  ggplot2::theme_bw() +
  ggplot2::aes(x = nzero, y = median_cvm) +
  ggplot2::geom_point() + ggplot2::geom_line()+
  ggplot2::labs(y="median cvm", x = "number of non-zero coefficients")+
  ggplot2::scale_x_continuous(breaks=0:14, labels=)+
  ggplot2::theme(axis.text=element_text(size=15),axis.title=element_text(size=18))

gridExtra::grid.arrange(g1_Placenta_PREDO_wa, g2_Placenta_PREDO_wa, ncol = 1)
png(filename="Results/Figures/elasticNet_singleTissues/Outcome_main/bootstrapModels_Placenta_PREDO.png", width=2400, height=1800, res=300)
gridExtra::grid.arrange(g1_Placenta_PREDO_wa, g2_Placenta_PREDO_wa, ncol = 1)
dev.off()
png(filename="Results/Figures/elasticNet_singleTissues/Outcome_main/Model_Placena_PREDO.png", width=2800, height=1400, res=400)
g1_Placenta_PREDO_wa
dev.off()
elbow_finder(csummary_Placenta_PREDO_wa$nzero, csummary_Placenta_PREDO_wa$median_cvm)

nzero_indices_Placenta_PREDO_wa<- data.frame(t(elbow_finder(csummary_Placenta_PREDO_wa$nzero, csummary_Placenta_PREDO_wa$median_cvm)))
colnames(nzero_indices_Placenta_PREDO_wa) <- c("x", "y")
rownames(nzero_indices_Placenta_PREDO_wa) <- NULL

look at models with 7 non-zero coefficient.

nzero_final_placenta_predo_wa <- 9
csummary_Placenta_PREDO_wa[nzero %in% nzero_final_placenta_predo_wa]
nonzero_choose_Placenta_PREDO_wa <- ggplot2::ggplot(csummary_Placenta_PREDO_wa) +
  ggplot2::theme_bw()+
  ggplot2::aes(x = nzero, y = median_cvm) +
  ggplot2::scale_x_continuous(breaks=c(0:17))+
  ggplot2::geom_point() + ggplot2::geom_line()+
  ggplot2::geom_point(data=nzero_indices_Placenta_PREDO_wa, aes(x=x, y=y), colour="red", size=2)+
  ggplot2::ylab("median of minimum cross-validation errors over bootstraps")+
  ggplot2::xlab("number of non-zero coefficients")+
  ggplot2::geom_segment(aes(x = nzero[1], y = median_cvm[1], xend = nzero[14], yend = median_cvm[14], colour = "segment"), data = csummary_Placenta_PREDO_wa, show.legend = F)

nonzero_choose_Placenta_PREDO_wa
png(filename="Results/Figures/elasticNet_singleTissues/Outcome_main/nzero_choose_Placenta_PREDO.png", width=1600, height=1400, res=300)
nonzero_choose_Placenta_PREDO_wa
dev.off()
summary_Placenta_PREDO_wa_finalnzero <- csummary_Placenta_PREDO_wa[nzero %in% nzero_final_placenta_predo_wa]
sig_var_names_Placenta_PREDO_wa_finalnzero <- Filter(function(x) any(x > 0.75), summary_Placenta_PREDO_wa_finalnzero[,!c("nzero", "mean_cvm", "median_cvm")]) %>% colnames()
colnames(summary_Placenta_PREDO_wa_finalnzero) <- c("non-zero", "child sex", "birth weight", "birth length", "head circumference", "delivery mode (aided)", "induced labor (yes)", "parity (birth before)", "maternal age", "maternal BMI", "maternal hypertension (yes)", "maternal diabetes (yes)", "maternal mental disorders (yes)", "maternal smoking (yes)", "maternal \alcohol use (yes)", "mean cvm", "median cvm")
summary_Placenta_PREDO_wa_finalnzeroT <- as.data.frame(t(summary_Placenta_PREDO_wa_finalnzero[,-c("non-zero", "median cvm", "mean cvm")]))
summary_Placenta_PREDO_wa_finalnzeroT$variable <- rownames(summary_Placenta_PREDO_wa_finalnzeroT)
rownames(summary_Placenta_PREDO_wa_finalnzeroT) <- NULL
names(summary_Placenta_PREDO_wa_finalnzeroT)[names(summary_Placenta_PREDO_wa_finalnzeroT) == 'V1'] <- 'percent'
summary_Placenta_PREDO_wa_finalnzeroT <- summary_Placenta_PREDO_wa_finalnzeroT[order(summary_Placenta_PREDO_wa_finalnzeroT$percent),]

summary_Placenta_PREDO_wa_finalnzeroT$number <- seq(1, length(summary_Placenta_PREDO_wa_finalnzeroT$variable))
perc_vars_Placenta_PREDO_wa <- 
  ggplot(summary_Placenta_PREDO_wa_finalnzeroT, aes(reorder(variable, percent), percent, group=1))+
  geom_point()+ geom_line()+
  ylab("% occurence in models with nzero coefficients = 8")+
  scale_y_continuous(breaks=c(0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9))+
  xlab("variable")+
  coord_flip()+
  geom_hline(yintercept=0.75, linetype="dotted")+
  theme_bw()

perc_vars_Placenta_PREDO_wa

# decide for cut-off % -> here .75

Filter(function(x) any(x > 0.75), summary_Placenta_PREDO_wa_finalnzero[,!c("non-zero", "mean cvm", "median cvm")])
png(filename="Results/Figures/elasticNet_singleTissues/Outcome_main/varsPercent_Placenta_PREDO.png", width=1100, height=1400, res=300)
perc_vars_Placenta_PREDO_wa
dev.off()
```r
pm2_Placenta_PREDO_wa_coef <-
  dcast(pm2_Placenta_PREDO_wa[,
                                as.list(unlist(
                                  lapply(.SD,
                                         function(x) {
                                           y <- unname(quantile(x[x != 0], probs = c(0.025, 0.975)))
                                           list(\non_zero\ = 100 * mean(x != 0),
                                                lcl = y[1],
                                                ucl = y[2],
                                                width = diff(y),
                                                median = median(x[x!= 0]))
                                         }))),
                                .SDcols = c(\Child_Sexfemale\, \Birth_Weight\, \Birth_Length\, \Head_Circumference_at_Birth\, \Delivery_Mode_dichotomaided\, \inducedlabourYes\, \Parity_dichotomgiven birth before\, \Maternal_Age_18PopRegandBR\, \Maternal_PrepregnancyBMI18oct28new\, \maternal_hypertension_dichotomhypertension in current pregnancy\,\maternal_diabetes_dichotomdiabetes in current pregnancy\,\Maternal_Mental_Disorders_By_ChildbirthYes\,\smoking_dichotomyes\,\Alcohol_Use_In_Early_Pregnancy_19Octyes\),
                                by = nzero][order(nzero)] %>%
          melt(id.var = \nzero\) %>%
          .[, metric := sub(\^.+\\.(.+)$\, \\\1\, variable)] %>%
          .[, variable := sub(\^(.+)\\..+$\, \\\1\, variable)] %>%
          .[nzero == nzero_final_placenta_predo_wa], nzero+ variable ~ metric, value.var=\value\)

# get desired order of predictors
pm2_Placenta_PREDO_wa_coef <-
  pm2_Placenta_PREDO_wa_coef[match(c(\Child_Sexfemale\, \Birth_Weight\, \Birth_Length\, \Head_Circumference_at_Birth\, \Delivery_Mode_dichotomaided\, \inducedlabourYes\, \Parity_dichotomgiven birth before\, \Maternal_Age_18PopRegandBR\, \Maternal_PrepregnancyBMI18oct28new\, \maternal_hypertension_dichotomhypertension in current pregnancy\,\maternal_diabetes_dichotomdiabetes in current pregnancy\,\Maternal_Mental_Disorders_By_ChildbirthYes\,\smoking_dichotomyes\,\Alcohol_Use_In_Early_Pregnancy_19Octyes\), pm2_Placenta_PREDO_wa_coef$variable),]
pm2_Placenta_PREDO_wa_coef$variable <- factor(pm2_Placenta_PREDO_wa_coef$variabl, levels=unique(pm2_Placenta_PREDO_wa_coef$variable))

## NOTE: median is used here instead of mean
# make frame for only significant variables:
pm2_Placenta_PREDO_wa_datable <- dcast(pm2_Placenta_PREDO_wa[,
                                                                 as.list(unlist(
                                                                   lapply(.SD,
                                                                          function(x) {
                                                                            y <- unname(quantile(x[x != 0], probs = c(0.025, 0.975)))
                                                                            list(\non_zero\ = 100 * mean(x != 0),
                                                                                 lcl = y[1],
                                                                                 ucl = y[2],
                                                                                 width = diff(y),
                                                                                 median = median(x[x!= 0]))
                                                                          }))),
                                                                 .SDcols = c(\Child_Sexfemale\, \Birth_Weight\, \Birth_Length\, \Head_Circumference_at_Birth\, \Delivery_Mode_dichotomaided\, \inducedlabourYes\, \Parity_dichotomgiven birth before\, \Maternal_Age_18PopRegandBR\, \Maternal_PrepregnancyBMI18oct28new\, \maternal_hypertension_dichotomhypertension in current pregnancy\,\maternal_diabetes_dichotomdiabetes in current pregnancy\,\Maternal_Mental_Disorders_By_ChildbirthYes\,\smoking_dichotomyes\,\Alcohol_Use_In_Early_Pregnancy_19Octyes\),
                                                                 by = nzero][order(nzero)] %>%
                                           melt(id.var = \nzero\) %>%
                                           .[, metric := sub(\^.+\\.(.+)$\, \\\1\, variable)] %>%
                                           .[, variable := sub(\^(.+)\\..+$\, \\\1\, variable)] %>%
                                           # print %>%
                                           .[nzero == nzero_final_placenta_predo_wa& variable %in% sig_var_names_Placenta_PREDO_wa_finalnzero], nzero+ variable ~ metric, value.var=\value\)

<!-- rnb-source-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->




<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxuc2lnX3ZhcnNfUGxhY2VudGFfUFJFRE9fd2EgPC1cbiAgcG0yX1BsYWNlbnRhX1BSRURPX3dhX2NvZWYgJT4lXG4gIGdncGxvdDI6OmdncGxvdCguKSArXG4gIGdncGxvdDI6OnRoZW1lX2J3KCkgK1xuICBnZ3Bsb3QyOjp0aGVtZShheGlzLnRleHQueD1lbGVtZW50X2JsYW5rKCkpK1xuICBnZ3Bsb3QyOjphZXMoeD1cXG56ZXJvXFwpK1xuICBnZ3Bsb3QyOjpnZW9tX3BvaW50KG1hcHBpbmcgPSBnZ3Bsb3QyOjphZXMoeSA9IHZhcmlhYmxlLCBzaXplID1ub25femVybywgYWxwaGEgPSBub25femVybywgY29sb3IgPSBub25femVybykpICtcbiAgZ2dwbG90Mjo6Z2VvbV90ZXh0KGFlcyh5PXZhcmlhYmxlLCBsYWJlbD1zcHJpbnRmKFxcJTAuMmZcXCwgcm91bmQobWVkaWFuLCBkaWdpdHM9MikpLCBzaXplPTUwKSxoanVzdD0wLCB2anVzdD0wLjUsIG51ZGdlX3ggPSAwLjEpK1xuICBnZ3Bsb3QyOjpzY2FsZV9jb2xvcl9ncmFkaWVudDIoaGlnaCA9ICdncmVlbicsIG1pZCA9IFxccHVycGxlXFwsIGxvdyA9IFxcYmxhY2tcXCwgbWlkcG9pbnQgPTUwKStcbiAgZ2dwbG90Mjo6c2NhbGVfYWxwaGEoZ3VpZGUgPSAnbm9uZScpK1xuICBnZ3Bsb3QyOjpzY2FsZV9zaXplKGd1aWRlID0gJ25vbmUnKStcbiAgZ2dwbG90Mjo6c2NhbGVfeV9kaXNjcmV0ZShsYWJlbHM9IGMoXFxjaGlsZCBzZXhcXCwgXFxiaXJ0aCB3ZWlnaHRcXCwgXFxiaXJ0aCBsZW5ndGhcXCwgXFxoZWFkIGNpcmN1bWZlcmVuY2VcXCwgXFxkZWxpdmVyeSBtb2RlIChhaWRlZClcXCwgXFxpbmR1Y2VkIGxhYm9yICh5ZXMpXFwsIFxccGFyaXR5IChiaXJ0aCBiZWZvcmUpXFwsIFxcbWF0ZXJuYWwgYWdlXFwsIFxcbWF0ZXJuYWwgQk1JXFwsIFxcbWF0ZXJuYWwgaHlwZXJ0ZW5zaW9uICh5ZXMpXFwsIFxcbWF0ZXJuYWwgZGlhYmV0ZXMgKHllcylcXCwgXFxtYXRlcm5hbCBtZW50YWwgZGlzb3JkZXJzICh5ZXMpXFwsIFxcbWF0ZXJuYWwgc21va2luZyAoeWVzKVxcLCBcXG1hdGVybmFsIGFsY29ob2wgdXNlICh5ZXMpXFwpKStcbiAgZ2dwbG90Mjo6bGFicyh5PVxccHJlZGljdG9yXFwsIHggPSBcXG51bWJlciBvZiBub24temVybyBjb2VmZmljaWVudHMgPSA5XFwsIGNvbG9yPVxcJVxcKVxuXG5cbmBgYFxuYGBgIn0= -->

```r
```r
sig_vars_Placenta_PREDO_wa <-
  pm2_Placenta_PREDO_wa_coef %>%
  ggplot2::ggplot(.) +
  ggplot2::theme_bw() +
  ggplot2::theme(axis.text.x=element_blank())+
  ggplot2::aes(x=\nzero\)+
  ggplot2::geom_point(mapping = ggplot2::aes(y = variable, size =non_zero, alpha = non_zero, color = non_zero)) +
  ggplot2::geom_text(aes(y=variable, label=sprintf(\%0.2f\, round(median, digits=2)), size=50),hjust=0, vjust=0.5, nudge_x = 0.1)+
  ggplot2::scale_color_gradient2(high = 'green', mid = \purple\, low = \black\, midpoint =50)+
  ggplot2::scale_alpha(guide = 'none')+
  ggplot2::scale_size(guide = 'none')+
  ggplot2::scale_y_discrete(labels= c(\child sex\, \birth weight\, \birth length\, \head circumference\, \delivery mode (aided)\, \induced labor (yes)\, \parity (birth before)\, \maternal age\, \maternal BMI\, \maternal hypertension (yes)\, \maternal diabetes (yes)\, \maternal mental disorders (yes)\, \maternal smoking (yes)\, \maternal alcohol use (yes)\))+
  ggplot2::labs(y=\predictor\, x = \number of non-zero coefficients = 9\, color=\%\)

<!-- rnb-source-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->



<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuY29lZl9QbGFjZW50YV9QUkVET193YSA8LSBcbiAgZ2dwbG90KHBtMl9QbGFjZW50YV9QUkVET193YV9jb2VmLCBhZXMoeSA9IHZhcmlhYmxlLCB4PW1lZGlhbikpK1xuICBnZW9tX3BvaW50KG1hcHBpbmcgPSBnZ3Bsb3QyOjphZXMoeSA9IHZhcmlhYmxlLCBzaXplID1ub25femVybywgYWxwaGEgPSBub25femVybywgY29sb3IgPSBub25femVybykpK1xuICBzY2FsZV9jb2xvcl9ncmFkaWVudDIoaGlnaCA9ICdncmVlbicsIG1pZCA9IFwicHVycGxlXCIsIGxvdyA9IFwiYmxhY2tcIiwgbWlkcG9pbnQgPTUwLCBsaW1pdHM9YygwLDEwMCkpK1xuICBzY2FsZV9hbHBoYShndWlkZSA9ICdub25lJykrXG4gIHNjYWxlX3NpemUoZ3VpZGUgPSAnbm9uZScpK1xuICBnZW9tX3BvaW50KCkrXG4gIGdlb21fZXJyb3JiYXIoYWVzKHkgPSB2YXJpYWJsZSwgeG1pbiA9IGxjbCwgeG1heCA9IHVjbCksIHdpZHRoID0gMC4yKStcbiAgbGFicyh5PVwicHJlZGljdG9yXCIsIHggPSBcIlxcbm1lZGlhbiAmIDk1JSBDSSBvZiBjb2VmZmljaWVudCAob3ZlciBib290c3RyYXBzKVwiLCBjb2xvcj1cIiVcIikrXG4gIHNjYWxlX3hfY29udGludW91cyhsaW1pdHM9YygtMC41LDAuNCksIGJyZWFrcz1jKC0uNCwtLjMsLS4yLCAtLjEsIDAsIC4xLCAuMiwgLjMsIC40KSkrXG4gIHNjYWxlX3lfZGlzY3JldGUobGFiZWxzPSBjKFwiY2hpbGQgc2V4IChmZW1hbGUpXCIsIFwiYmlydGggd2VpZ2h0XCIsIFwiYmlydGggbGVuZ3RoXCIsIFwiaGVhZCBjaXJjdW1mZXJlbmNlXCIsIFwiZGVsaXZlcnkgbW9kZSAoYWlkZWQpXCIsIFwiaW5kdWNlZCBsYWJvciAoeWVzKVwiLCBcInBhcml0eSAoYmlydGggYmVmb3JlKVwiLCBcIm1hdGVybmFsIGFnZVwiLCBcIm1hdGVybmFsIEJNSVwiLCBcIm1hdGVybmFsIGh5cGVydGVuc2lvbiAoeWVzKVwiLCBcIm1hdGVybmFsIGRpYWJldGVzICh5ZXMpXCIsIFwibWF0ZXJuYWwgbWVudGFsIGRpc29yZGVycyAoeWVzKVwiLCBcIm1hdGVybmFsIHNtb2tpbmcgKHllcylcIiwgXCJtYXRlcm5hbCBhbGNvaG9sIHVzZSAoeWVzKVwiKSkrXG4gIGdlb21fdmxpbmUoeGludGVyY2VwdD0wLCBsaW5ldHlwZT1cImRhc2hlZFwiKStcbiAgdGhlbWVfYncoKStcbiAgdGhlbWUodGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTUpLCBheGlzLnRpdGxlLng9IGVsZW1lbnRfdGV4dChzaXplPTE1KSwgYXhpcy50aXRsZS55PSBlbGVtZW50X3RleHQoc2l6ZT0xNSkpXG5cblxuY29lZl9QbGFjZW50YV9QUkVET193YVxuYGBgIn0= -->

```r
coef_Placenta_PREDO_wa <- 
  ggplot(pm2_Placenta_PREDO_wa_coef, aes(y = variable, x=median))+
  geom_point(mapping = ggplot2::aes(y = variable, size =non_zero, alpha = non_zero, color = non_zero))+
  scale_color_gradient2(high = 'green', mid = "purple", low = "black", midpoint =50, limits=c(0,100))+
  scale_alpha(guide = 'none')+
  scale_size(guide = 'none')+
  geom_point()+
  geom_errorbar(aes(y = variable, xmin = lcl, xmax = ucl), width = 0.2)+
  labs(y="predictor", x = "\nmedian & 95% CI of coefficient (over bootstraps)", color="%")+
  scale_x_continuous(limits=c(-0.5,0.4), breaks=c(-.4,-.3,-.2, -.1, 0, .1, .2, .3, .4))+
  scale_y_discrete(labels= c("child sex (female)", "birth weight", "birth length", "head circumference", "delivery mode (aided)", "induced labor (yes)", "parity (birth before)", "maternal age", "maternal BMI", "maternal hypertension (yes)", "maternal diabetes (yes)", "maternal mental disorders (yes)", "maternal smoking (yes)", "maternal alcohol use (yes)"))+
  geom_vline(xintercept=0, linetype="dashed")+
  theme_bw()+
  theme(text = element_text(size = 15), axis.title.x= element_text(size=15), axis.title.y= element_text(size=15))


coef_Placenta_PREDO_wa
png(filename="Results/Figures/elasticNet_singleTissues/Outcome_main/coef_Placenta_PREDO.png", width=2800, height=1400, res=400)
coef_Placenta_PREDO_wa
dev.off()
p1 <-
  csummary_Placenta_PREDO_wa %>%
  melt(id.vars = c("nzero", "mean_cvm", "median_cvm")) %>%
  ggplot2::ggplot(.) +
  ggplot2::theme_bw() +
  ggplot2::aes(x = nzero) +
  ggplot2::geom_point(mapping = ggplot2::aes(y = variable, size = value, alpha = value, color = value*100)) +
  ggplot2::scale_color_gradient2(high = 'green', mid = "purple", low = "black", midpoint =50)+
  ggplot2::scale_alpha(guide = 'none')+
  ggplot2::scale_size(guide = 'none')+
  ggplot2::scale_y_discrete(labels= c("child sex (female)", "birth weight", "birth length", "head circumference", "delivery mode (aided)", "induced labor (yes)", "parity (birth before)", "maternal age", "maternal BMI", "maternal hypertension (yes)", "maternal diabetes (yes)", "maternal mental disorders (yes)", "maternal smoking (yes)", "maternal alcohol use (yes)"))+
  ggplot2::scale_x_continuous(breaks=0:14, labels=)+
  ggplot2::labs(y="predictor", x = "\nnumber of non-zero coefficients", color="%")+
  ggplot2::theme(text = element_text(size = 17), axis.title.x= element_text(size=15), axis.title.y= element_text(size=15), legend.position = "none")
  
p2 <- 
coef_Placenta_PREDO_wa <- 
  ggplot(pm2_Placenta_PREDO_wa_coef, aes(y = variable, x=median))+
  geom_point(mapping = ggplot2::aes(y = variable, size =non_zero, alpha = non_zero, color = non_zero))+
  scale_color_gradient2(high = 'green', mid = "purple", low = "black", midpoint =50, limits=c(0,100))+
  scale_alpha(guide = 'none')+
  scale_size(guide = 'none')+
  geom_point()+
  geom_errorbar(aes(y = variable, xmin = lcl, xmax = ucl), width = 0.2)+
  labs(y="", x = "\nmedian & 95% CI of coefficient (over bootstraps)", color="%")+
  scale_x_continuous(limits=c(-0.5,0.4), breaks=c(-.4,-.3,-.2, -.1, 0, .1, .2, .3, .4))+
  scale_y_discrete(labels= c("child sex (female)", "birth weight", "birth length", "head circumference", "delivery mode (aided)", "induced labor (yes)", "parity (birth before)", "maternal age", "maternal BMI", "maternal hypertension (yes)", "maternal diabetes (yes)", "maternal mental disorders (yes)", "maternal smoking (yes)", "maternal alcohol use (yes)"))+
  geom_vline(xintercept=0, linetype="dashed")+
  theme_bw()+
  ggtitle("nzero = 9")+
  theme(text = element_text(size = 17), axis.title.x= element_text(size=15), axis.title.y= element_text(size=15), plot.title = element_text(size=15), axis.text.y=element_blank())

g1 <- ggplotGrob(p1)
g2 <- ggplotGrob(p2)
g <- cbind(g1, g2, size = "last")
g$heights <- unit.pmax(g1$heights, g2$heights)

png(filename="Results/Figures/elasticNet_singleTissues/Outcome_main/Model_coef_Placenta_PREDO.png", width=5800, height=1600, res=400)
grid.draw(g)
dev.off()

to the top

Placenta elastic net splitted by sex

model without alcohol variable, but splitted by sex

males

```r
# in case you want to start from here
load(\InputData/ClockCalculationsInput/Reg_Input_Data_Placenta_male_PREDO_EAAR_noNa_n.Rdata\)
Reg_Input_Data_Placenta_male_PREDO_EAAR_noNa_n$Child_Sex <- NULL

<!-- rnb-source-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->




<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxueXJjX21hdF9QUkVET19QbGFjZW50YV9tYWxlX24gPC0gbWF0cml4KFJlZ19JbnB1dF9EYXRhX1BsYWNlbnRhX21hbGVfUFJFRE9fRUFBUl9ub05hX24kRUFBUl9MZWUpXG54cmNfbWF0X1BSRURPX1BsYWNlbnRhX21hbGVfbiA8LSBtb2RlbC5tYXRyaXgoIH4gLiAtIEVBQVJfTGVlLCBkYXRhID0gUmVnX0lucHV0X0RhdGFfUGxhY2VudGFfbWFsZV9QUkVET19FQUFSX25vTmFfbilbLCAtMV1cbnlyY19tYXRfUFJFRE9fc2NhbGVkX1BsYWNlbnRhX21hbGVfbiA8LSBzY2FsZSh5cmNfbWF0X1BSRURPX1BsYWNlbnRhX21hbGVfbilcbnhyY19tYXRfUFJFRE9fc2NhbGVkX1BsYWNlbnRhX21hbGVfbiA8LSBzY2FsZSh4cmNfbWF0X1BSRURPX1BsYWNlbnRhX21hbGVfbilcbmBgYFxuYGBgIn0= -->

```r
```r
yrc_mat_PREDO_Placenta_male_n <- matrix(Reg_Input_Data_Placenta_male_PREDO_EAAR_noNa_n$EAAR_Lee)
xrc_mat_PREDO_Placenta_male_n <- model.matrix( ~ . - EAAR_Lee, data = Reg_Input_Data_Placenta_male_PREDO_EAAR_noNa_n)[, -1]
yrc_mat_PREDO_scaled_Placenta_male_n <- scale(yrc_mat_PREDO_Placenta_male_n)
xrc_mat_PREDO_scaled_Placenta_male_n <- scale(xrc_mat_PREDO_Placenta_male_n)

<!-- rnb-source-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->


<!-- set seed -->
<!-- ```{r} -->
<!-- set.seed(2020) -->
<!-- ``` -->


<!-- ```{r, warning=F} -->
<!--   nboot = 1000 -->

<!--   bootstraps_Placenta_male_PREDO_n <- replicate(nboot, { -->
<!--     rws <- sample(1:nrow(xrc_mat_PREDO_scaled_Placenta_male_n), replace = TRUE) -->
<!--     ensr(xrc_mat_PREDO_scaled_Placenta_male_n[rws, ], yrc_mat_PREDO_scaled_Placenta_male_n[rws, ], standardized = FALSE, family="gaussian", nlambda=100, nfolds=10, alpha=c(0.0,0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1.0)) -->
<!--   }, -->
<!--   simplify = FALSE) -->
<!-- ``` -->

<!-- ```{r} -->
<!-- save(bootstraps_Placenta_male_PREDO_n, file="InputData/Data_ElasticNets/bootstraps_Placenta_male_PREDO_n_1000.Rdata") -->
<!-- ``` -->



<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxubG9hZChcXElucHV0RGF0YS9EYXRhX0VsYXN0aWNOZXRzL2Jvb3RzdHJhcHNfUGxhY2VudGFfbWFsZV9QUkVET19uXzEwMDAuUmRhdGFcXClcbmBgYFxuYGBgIn0= -->

```r
```r
load(\InputData/Data_ElasticNets/bootstraps_Placenta_male_PREDO_n_1000.Rdata\)

<!-- rnb-source-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->



<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuc3VtbWFyaWVzX1BsYWNlbnRhX21hbGVfUFJFRE9fbiA8LVxuICBib290c3RyYXBzX1BsYWNlbnRhX21hbGVfUFJFRE9fbiAlPiVcbiAgbGFwcGx5KHN1bW1hcnkpICU+JVxuICByYmluZGxpc3QoaWRjb2wgPSBcImJvb3RzdHJhcFwiKVxuXG5zdW1tYXJpZXNfUGxhY2VudGFfbWFsZV9QUkVET19uXG5gYGAifQ== -->

```r
summaries_Placenta_male_PREDO_n <-
  bootstraps_Placenta_male_PREDO_n %>%
  lapply(summary) %>%
  rbindlist(idcol = "bootstrap")

summaries_Placenta_male_PREDO_n
summaries_Placenta_male_PREDO_n[, .SD[cvm == min(cvm)], by = c("bootstrap", "nzero")] %>%
  ggplot2::ggplot(data = .) +
  ggplot2::aes(x = nzero, y = cvm, group = bootstrap) +
  ggplot2::geom_point() +
  ggplot2::geom_line()
png(filename="Results/Figures/elasticNet_singleTissues/Outcome_add/sex_split/bootstraps_Placenta_PREDO_MALE.png", width=800, height=600)
summaries_Placenta_male_PREDO_n[, .SD[cvm == min(cvm)], by = c("bootstrap", "nzero")] %>%
  ggplot2::ggplot(data = .) +
  ggplot2::aes(x = nzero, y = cvm, group = bootstrap) +
  ggplot2::geom_point() +
  ggplot2::geom_line()
dev.off()
```r
load(\InputData/Data_ElasticNets/pm2_Placenta_male_PREDO_n.Rdata\)
# coefficient values for the models with smallest cvm by number of non-erzo coefficients and bootstrap

<!-- rnb-source-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->




<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuY3N1bW1hcnlfUGxhY2VudGFfbWFsZV9QUkVET19uIDwtIFJlZHVjZShmdW5jdGlvbih4LHkpIG1lcmdlKHggPSB4LCB5ID0geSwgYnkgPSBcIm56ZXJvXCIpLCBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3QocG0yX1BsYWNlbnRhX21hbGVfUFJFRE9fblssIGxhcHBseSguU0QsIGZ1bmN0aW9uKHgpIHttZWFuKHggIT0gMCl9KSwgLlNEY29scyA9IGMoXCJCaXJ0aF9XZWlnaHRcIiwgXCJCaXJ0aF9MZW5ndGhcIiwgXCJIZWFkX0NpcmN1bWZlcmVuY2VfYXRfQmlydGhcIiwgXCJEZWxpdmVyeV9Nb2RlX2RpY2hvdG9tYWlkZWRcIiwgXCJpbmR1Y2VkbGFib3VyWWVzXCIsIFwiUGFyaXR5X2RpY2hvdG9tZ2l2ZW4gYmlydGggYmVmb3JlXCIsIFwiTWF0ZXJuYWxfQWdlXzE4UG9wUmVnYW5kQlJcIiwgXCJNYXRlcm5hbF9QcmVwcmVnbmFuY3lCTUkxOG9jdDI4bmV3XCIsIFwibWF0ZXJuYWxfaHlwZXJ0ZW5zaW9uX2RpY2hvdG9taHlwZXJ0ZW5zaW9uIGluIGN1cnJlbnQgcHJlZ25hbmN5XCIsXCJtYXRlcm5hbF9kaWFiZXRlc19kaWNob3RvbWRpYWJldGVzIGluIGN1cnJlbnQgcHJlZ25hbmN5XCIsXCJNYXRlcm5hbF9NZW50YWxfRGlzb3JkZXJzX0J5X0NoaWxkYmlydGhZZXNcIixcInNtb2tpbmdfZGljaG90b215ZXNcIiksIGJ5ID0gbnplcm9dXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG0yX1BsYWNlbnRhX21hbGVfUFJFRE9fblssIC4obWVhbl9jdm0gPSBtZWFuKGN2bSkpLCBieSA9IG56ZXJvXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG0yX1BsYWNlbnRhX21hbGVfUFJFRE9fblssIC4obWVkaWFuX2N2bSA9IG1lZGlhbihjdm0pKSwgYnkgPSBuemVyb11cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkpW29yZGVyKG56ZXJvKV1cblxuY3N1bW1hcnlfUGxhY2VudGFfbWFsZV9QUkVET19uXG5gYGAifQ== -->

```r
csummary_Placenta_male_PREDO_n <- Reduce(function(x,y) merge(x = x, y = y, by = "nzero"), 
                                       list(pm2_Placenta_male_PREDO_n[, lapply(.SD, function(x) {mean(x != 0)}), .SDcols = c("Birth_Weight", "Birth_Length", "Head_Circumference_at_Birth", "Delivery_Mode_dichotomaided", "inducedlabourYes", "Parity_dichotomgiven birth before", "Maternal_Age_18PopRegandBR", "Maternal_PrepregnancyBMI18oct28new", "maternal_hypertension_dichotomhypertension in current pregnancy","maternal_diabetes_dichotomdiabetes in current pregnancy","Maternal_Mental_Disorders_By_ChildbirthYes","smoking_dichotomyes"), by = nzero]
                                            ,
                                            pm2_Placenta_male_PREDO_n[, .(mean_cvm = mean(cvm)), by = nzero],
                                            pm2_Placenta_male_PREDO_n[, .(median_cvm = median(cvm)), by = nzero]
                                       ))[order(nzero)]

csummary_Placenta_male_PREDO_n
g1_Placenta_male_PREDO_n <-
  csummary_Placenta_male_PREDO_n %>%
  melt(id.vars = c("nzero", "mean_cvm", "median_cvm")) %>%
  ggplot2::ggplot(.) +
  ggplot2::theme_bw() +
  ggplot2::aes(x = nzero) +
  ggplot2::geom_point(mapping = ggplot2::aes(y = variable, size = value, alpha = value, color = value*100)) +
  ggplot2::scale_color_gradient2(high = 'green', mid = "purple", low = "black", midpoint =50)+
  ggplot2::scale_alpha(guide = 'none')+
  ggplot2::scale_size(guide = 'none')+
  ggplot2::scale_y_discrete(labels= c("birth weight", "birth length", "head circumference", "delivery mode", "induced labor", "parity", "maternal age", "maternal BMI", "maternal hypertension", "maternal diabetes", "maternal mental disorders", "maternal smoking"))+
  ggplot2::scale_x_continuous(breaks=0:14, labels=)+
  ggplot2::labs(y="predictor", x = "number of non-zero coefficients", color="%")+
  ggplot2::theme(text = element_text(size = 15), axis.title.x= element_text(size=15), axis.title.y= element_text(size=15))
  

g2_Placenta_male_PREDO_n <-
  csummary_Placenta_male_PREDO_n %>%
  ggplot2::ggplot(.) +
  ggplot2::theme_bw() +
  ggplot2::aes(x = nzero, y = median_cvm) +
  ggplot2::geom_point() + ggplot2::geom_line()+
  ggplot2::labs(y="median cvm", x = "number of non-zero coefficients")+
  ggplot2::scale_x_continuous(breaks=0:14, labels=)+
  ggplot2::theme(axis.text=element_text(size=15),axis.title=element_text(size=18))

gridExtra::grid.arrange(g1_Placenta_male_PREDO_n, g2_Placenta_male_PREDO_n, ncol = 1)
png(filename="Results/Figures/elasticNet_singleTissues/Outcome_add/sex_split/bootstrapModels_Placenta_PREDO_male.png", width=2400, height=1800, res=300)
gridExtra::grid.arrange(g1_Placenta_male_PREDO_n, g2_Placenta_male_PREDO_n, ncol = 1)
dev.off()
png(filename="Results/Figures/elasticNet_singleTissues/Outcome_add/sex_split/Model_Placenta_PREDO_male.png", width=2800, height=1400, res=400)
g1_Placenta_male_PREDO_n
dev.off()
elbow_finder(csummary_Placenta_male_PREDO_n$nzero, csummary_Placenta_male_PREDO_n$median_cvm)

nzero_indices_Cord <- data.frame(t(elbow_finder(csummary_Placenta_male_PREDO_n$nzero, csummary_Placenta_male_PREDO_n$median_cvm)))
colnames(nzero_indices_Cord) <- c("x", "y")
rownames(nzero_indices_Cord) <- NULL
```r
nzero_final_placenta_male <- 5

<!-- rnb-source-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->




<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuY3N1bW1hcnlfUGxhY2VudGFfbWFsZV9QUkVET19uW256ZXJvICVpbiUgbnplcm9fZmluYWxfcGxhY2VudGFfbWFsZV1cbmBgYCJ9 -->

```r
csummary_Placenta_male_PREDO_n[nzero %in% nzero_final_placenta_male]
nonzero_choose_Placenta_male <- ggplot2::ggplot(csummary_Placenta_male_PREDO_n) +
  ggplot2::theme_bw()+
  ggplot2::aes(x = nzero, y = median_cvm) +
  ggplot2::scale_x_continuous(breaks=c(0:17))+
  ggplot2::geom_point() + ggplot2::geom_line()+
  ggplot2::geom_point(data=nzero_indices_Cord, aes(x=x, y=y), colour="red", size=2)+
  ggplot2::ylab("median of minimum cross-validation errors over bootstraps")+
  ggplot2::xlab("number of non-zero coefficients")+
  ggplot2::geom_segment(aes(x = nzero[1], y = median_cvm[1], xend = nzero[13], yend = median_cvm[13], colour = "segment"), data = csummary_Placenta_male_PREDO_n, show.legend = F)

nonzero_choose_Placenta_male
png(filename="Results/Figures/elasticNet_singleTissues/Outcome_add/sex_split/nzero_choose_Placenta_PREDO_male.png", width=1600, height=1400, res=300)
nonzero_choose_Placenta_male
dev.off()
```r
summary_Placenta_male_PREDO_n_finalnzero <- csummary_Placenta_male_PREDO_n[nzero %in% nzero_final_placenta_male]
sig_var_names_Placenta_male_PREDO_n_finalnzero <- Filter(function(x) any(x > 0.75), summary_Placenta_male_PREDO_n_finalnzero[,!c(\nzero\, \mean_cvm\, \median_cvm\)]) %>% colnames()
colnames(summary_Placenta_male_PREDO_n_finalnzero) <- c(\non-zero\, \birth weight\, \birth length\, \head circumference\, \delivery mode (aided)\, \induced labor (yes)\, \parity (birth before)\, \maternal age\, \maternal BMI\, \maternal hypertension (yes)\, \maternal diabetes (yes)\, \maternal mental disorders (yes)\, \maternal smoking (yes)\, \mean cvm\, \median cvm\)
summary_Placenta_male_PREDO_n_finalnzeroT <- as.data.frame(t(summary_Placenta_male_PREDO_n_finalnzero[,-c(\non-zero\, \median cvm\, \mean cvm\)]))
summary_Placenta_male_PREDO_n_finalnzeroT$variable <- rownames(summary_Placenta_male_PREDO_n_finalnzeroT)
rownames(summary_Placenta_male_PREDO_n_finalnzeroT) <- NULL
names(summary_Placenta_male_PREDO_n_finalnzeroT)[names(summary_Placenta_male_PREDO_n_finalnzeroT) == 'V1'] <- 'percent'
summary_Placenta_male_PREDO_n_finalnzeroT <- summary_Placenta_male_PREDO_n_finalnzeroT[order(summary_Placenta_male_PREDO_n_finalnzeroT$percent),]

summary_Placenta_male_PREDO_n_finalnzeroT$number <- seq(1, length(summary_Placenta_male_PREDO_n_finalnzeroT$variable))

<!-- rnb-source-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->



<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxucGVyY192YXJzX1BsYWNlbnRhX21hbGVfUFJFRE9fbiA8LSBcbiAgZ2dwbG90KHN1bW1hcnlfUGxhY2VudGFfbWFsZV9QUkVET19uX2ZpbmFsbnplcm9ULCBhZXMocmVvcmRlcih2YXJpYWJsZSwgcGVyY2VudCksIHBlcmNlbnQsIGdyb3VwPTEpKStcbiAgZ2VvbV9wb2ludCgpKyBnZW9tX2xpbmUoKStcbiAgeWxhYihcIiUgb2NjdXJlbmNlIGluIG1vZGVscyB3aXRoIG56ZXJvIGNvZWZmaWNpZW50cyA9IDVcIikrXG4gIHNjYWxlX3lfY29udGludW91cyhicmVha3M9YygwLjEsMC4yLDAuMywwLjQsMC41LDAuNiwwLjcsMC44LDAuOSkpK1xuICB4bGFiKFwidmFyaWFibGVcIikrXG4gIGNvb3JkX2ZsaXAoKStcbiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0PTAuNzUsIGxpbmV0eXBlPVwiZG90dGVkXCIpK1xuICB0aGVtZV9idygpXG5cbnBlcmNfdmFyc19QbGFjZW50YV9tYWxlX1BSRURPX25cblxuIyBkZWNpZGUgZm9yIGN1dC1vZmYgJSAtPiBoZXJlIC43NVxuXG5GaWx0ZXIoZnVuY3Rpb24oeCkgYW55KHggPiAwLjc1KSwgc3VtbWFyeV9QbGFjZW50YV9tYWxlX1BSRURPX25fZmluYWxuemVyb1ssIWMoXCJub24temVyb1wiLCBcIm1lYW4gY3ZtXCIsIFwibWVkaWFuIGN2bVwiKV0pXG5cbmBgYCJ9 -->

```r
perc_vars_Placenta_male_PREDO_n <- 
  ggplot(summary_Placenta_male_PREDO_n_finalnzeroT, aes(reorder(variable, percent), percent, group=1))+
  geom_point()+ geom_line()+
  ylab("% occurence in models with nzero coefficients = 5")+
  scale_y_continuous(breaks=c(0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9))+
  xlab("variable")+
  coord_flip()+
  geom_hline(yintercept=0.75, linetype="dotted")+
  theme_bw()

perc_vars_Placenta_male_PREDO_n

# decide for cut-off % -> here .75

Filter(function(x) any(x > 0.75), summary_Placenta_male_PREDO_n_finalnzero[,!c("non-zero", "mean cvm", "median cvm")])
png(filename="Results/Figures/elasticNet_singleTissues/Outcome_add/sex_split/varsPercent_Placenta_male.png", width=1100, height=1400, res=300)
perc_vars_Placenta_male_PREDO_n
dev.off()
pm2_Placenta_male_PREDO_n_coef <-
  dcast(pm2_Placenta_male_PREDO_n[,
                                as.list(unlist(
                                  lapply(.SD,
                                         function(x) {
                                           y <- unname(quantile(x[x != 0], probs = c(0.025, 0.975)))
                                           list("non_zero" = 100 * mean(x != 0),
                                                lcl = y[1],
                                                ucl = y[2],
                                                width = diff(y),
                                                median = median(x[x!= 0]))
                                         }))),
                                .SDcols = c("Birth_Weight", "Birth_Length", "Head_Circumference_at_Birth", "Delivery_Mode_dichotomaided", "inducedlabourYes", "Parity_dichotomgiven birth before", "Maternal_Age_18PopRegandBR", "Maternal_PrepregnancyBMI18oct28new", "maternal_hypertension_dichotomhypertension in current pregnancy","maternal_diabetes_dichotomdiabetes in current pregnancy","Maternal_Mental_Disorders_By_ChildbirthYes","smoking_dichotomyes"),
                                by = nzero][order(nzero)] %>%
          melt(id.var = "nzero") %>%
          .[, metric := sub("^.+\\.(.+)$", "\\1", variable)] %>%
          .[, variable := sub("^(.+)\\..+$", "\\1", variable)] %>%
          .[nzero ==nzero_final_placenta_male], nzero+ variable ~ metric, value.var="value")

# get desired order of predictors
pm2_Placenta_male_PREDO_n_coef <-
  pm2_Placenta_male_PREDO_n_coef[match(c("Birth_Weight", "Birth_Length", "Head_Circumference_at_Birth", "Delivery_Mode_dichotomaided", "inducedlabourYes", "Parity_dichotomgiven birth before", "Maternal_Age_18PopRegandBR", "Maternal_PrepregnancyBMI18oct28new", "maternal_hypertension_dichotomhypertension in current pregnancy","maternal_diabetes_dichotomdiabetes in current pregnancy","Maternal_Mental_Disorders_By_ChildbirthYes","smoking_dichotomyes"), pm2_Placenta_male_PREDO_n_coef$variable),]
pm2_Placenta_male_PREDO_n_coef$variable <- factor(pm2_Placenta_male_PREDO_n_coef$variabl, levels=unique(pm2_Placenta_male_PREDO_n_coef$variable))

## NOTE: median is used here instead of mean
# make frame for only significant variables:
pm2_Placenta_male_PREDO_n_datable <- dcast(pm2_Placenta_male_PREDO_n[,
                                                                 as.list(unlist(
                                                                   lapply(.SD,
                                                                          function(x) {
                                                                            y <- unname(quantile(x[x != 0], probs = c(0.025, 0.975)))
                                                                            list("non_zero" = 100 * mean(x != 0),
                                                                                 lcl = y[1],
                                                                                 ucl = y[2],
                                                                                 width = diff(y),
                                                                                 median = median(x[x!= 0]))
                                                                          }))),
                                                                 .SDcols = c("Birth_Weight", "Birth_Length", "Head_Circumference_at_Birth", "Delivery_Mode_dichotomaided", "inducedlabourYes", "Parity_dichotomgiven birth before", "Maternal_Age_18PopRegandBR", "Maternal_PrepregnancyBMI18oct28new", "maternal_hypertension_dichotomhypertension in current pregnancy","maternal_diabetes_dichotomdiabetes in current pregnancy","Maternal_Mental_Disorders_By_ChildbirthYes","smoking_dichotomyes"),
                                                                 by = nzero][order(nzero)] %>%
                                           melt(id.var = "nzero") %>%
                                           .[, metric := sub("^.+\\.(.+)$", "\\1", variable)] %>%
                                           .[, variable := sub("^(.+)\\..+$", "\\1", variable)] %>%
                                           # print %>%
                                           .[nzero == nzero_final_placenta_male & variable %in% sig_var_names_Placenta_male_PREDO_n_finalnzero], nzero+ variable ~ metric, value.var="value")

pm2_Placenta_male_PREDO_n_datable
```r
sig_vars_Placenta_male_PREDO_n <-
  pm2_Placenta_male_PREDO_n_coef %>%
  ggplot2::ggplot(.) +
  ggplot2::theme_bw() +
  ggplot2::theme(axis.text.x=element_blank())+
  ggplot2::aes(x=\nzero\)+
  ggplot2::geom_point(mapping = ggplot2::aes(y = variable, size =non_zero, alpha = non_zero, color = non_zero)) +
  ggplot2::geom_text(aes(y=variable, label=sprintf(\%0.2f\, round(median, digits=2)), size=50),hjust=0, vjust=0.5, nudge_x = 0.1)+
  ggplot2::scale_color_gradient2(high = 'green', mid = \purple\, low = \black\, midpoint =50)+
  ggplot2::scale_alpha(guide = 'none')+
  ggplot2::scale_size(guide = 'none')+
  ggplot2::scale_y_discrete(labels= c(\birth weight\, \birth length\, \head circumference\, \delivery mode (aided)\, \induced labor (yes)\, \parity (birth before)\, \maternal age\, \maternal BMI\, \maternal hypertension (yes)\, \maternal diabetes (yes)\, \maternal mental disorders (yes)\, \maternal smoking (yes)\))+
  ggplot2::labs(y=\predictor\, x = \number of non-zero coefficients = 5\, color=\%\)

<!-- rnb-source-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->



<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuY29lZl9QbGFjZW50YV9tYWxlX1BSRURPX24gPC0gXG4gIGdncGxvdChwbTJfUGxhY2VudGFfbWFsZV9QUkVET19uX2NvZWYsIGFlcyh5ID0gdmFyaWFibGUsIHg9bWVkaWFuKSkrXG4gIGdlb21fcG9pbnQobWFwcGluZyA9IGdncGxvdDI6OmFlcyh5ID0gdmFyaWFibGUsIHNpemUgPW5vbl96ZXJvLCBhbHBoYSA9IG5vbl96ZXJvLCBjb2xvciA9IG5vbl96ZXJvKSkrXG4gIHNjYWxlX2NvbG9yX2dyYWRpZW50MihoaWdoID0gJ2dyZWVuJywgbWlkID0gXCJwdXJwbGVcIiwgbG93ID0gXCJibGFja1wiLCBtaWRwb2ludCA9NTAsIGxpbWl0cz1jKDAsMTAwKSkrXG4gIHNjYWxlX2FscGhhKGd1aWRlID0gJ25vbmUnKStcbiAgc2NhbGVfc2l6ZShndWlkZSA9ICdub25lJykrXG4gIGdlb21fcG9pbnQoKStcbiAgZ2VvbV9lcnJvcmJhcihhZXMoeSA9IHZhcmlhYmxlLCB4bWluID0gbGNsLCB4bWF4ID0gdWNsKSwgd2lkdGggPSAwLjIpK1xuICBsYWJzKHk9XCJwcmVkaWN0b3JcIiwgeCA9IFwiXFxubWVkaWFuICYgOTUlIENJIG9mIGNvZWZmaWNpZW50IChvdmVyIGJvb3RzdHJhcHMpXCIsIGNvbG9yPVwiJVwiKStcbiAgc2NhbGVfeF9jb250aW51b3VzKGxpbWl0cz1jKC0wLjQsMC40KSwgYnJlYWtzPWMoLS40LC0uMywtLjIsIC0uMSwgMCwgLjEsIC4yLCAuMywgLjQpKStcbiAgc2NhbGVfeV9kaXNjcmV0ZShsYWJlbHM9IGMoXCJiaXJ0aCB3ZWlnaHRcIiwgXCJiaXJ0aCBsZW5ndGhcIiwgXCJoZWFkIGNpcmN1bWZlcmVuY2VcIiwgXCJkZWxpdmVyeSBtb2RlIChhaWRlZClcIiwgXCJpbmR1Y2VkIGxhYm9yICh5ZXMpXCIsIFwicGFyaXR5IChiaXJ0aCBiZWZvcmUpXCIsIFwibWF0ZXJuYWwgYWdlXCIsIFwibWF0ZXJuYWwgQk1JXCIsIFwibWF0ZXJuYWwgaHlwZXJ0ZW5zaW9uICh5ZXMpXCIsIFwibWF0ZXJuYWwgZGlhYmV0ZXMgKHllcylcIiwgXCJtYXRlcm5hbCBtZW50YWwgZGlzb3JkZXJzICh5ZXMpXCIsIFwibWF0ZXJuYWwgc21va2luZyAoeWVzKVwiKSkrXG4gIGdlb21fdmxpbmUoeGludGVyY2VwdD0wLCBsaW5ldHlwZT1cImRhc2hlZFwiKStcbiAgdGhlbWVfYncoKStcbiAgdGhlbWUodGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTUpLCBheGlzLnRpdGxlLng9IGVsZW1lbnRfdGV4dChzaXplPTE1KSwgYXhpcy50aXRsZS55PSBlbGVtZW50X3RleHQoc2l6ZT0xNSkpXG5cblxuY29lZl9QbGFjZW50YV9tYWxlX1BSRURPX25cbmBgYCJ9 -->

```r
coef_Placenta_male_PREDO_n <- 
  ggplot(pm2_Placenta_male_PREDO_n_coef, aes(y = variable, x=median))+
  geom_point(mapping = ggplot2::aes(y = variable, size =non_zero, alpha = non_zero, color = non_zero))+
  scale_color_gradient2(high = 'green', mid = "purple", low = "black", midpoint =50, limits=c(0,100))+
  scale_alpha(guide = 'none')+
  scale_size(guide = 'none')+
  geom_point()+
  geom_errorbar(aes(y = variable, xmin = lcl, xmax = ucl), width = 0.2)+
  labs(y="predictor", x = "\nmedian & 95% CI of coefficient (over bootstraps)", color="%")+
  scale_x_continuous(limits=c(-0.4,0.4), breaks=c(-.4,-.3,-.2, -.1, 0, .1, .2, .3, .4))+
  scale_y_discrete(labels= c("birth weight", "birth length", "head circumference", "delivery mode (aided)", "induced labor (yes)", "parity (birth before)", "maternal age", "maternal BMI", "maternal hypertension (yes)", "maternal diabetes (yes)", "maternal mental disorders (yes)", "maternal smoking (yes)"))+
  geom_vline(xintercept=0, linetype="dashed")+
  theme_bw()+
  theme(text = element_text(size = 15), axis.title.x= element_text(size=15), axis.title.y= element_text(size=15))


coef_Placenta_male_PREDO_n
png(filename="Results/Figures/elasticNet_singleTissues/Outcome_add/sex_split/coef_Placenta_PREDO_male.png", width=2800, height=1400, res=400)
coef_Placenta_male_PREDO_n
dev.off()
p1 <-
  csummary_Placenta_male_PREDO_n %>%
  melt(id.vars = c("nzero", "mean_cvm", "median_cvm")) %>%
  ggplot2::ggplot(.) +
  ggplot2::theme_bw() +
  ggplot2::aes(x = nzero) +
  ggplot2::geom_point(mapping = ggplot2::aes(y = variable, size = value, alpha = value, color = value*100)) +
  ggplot2::scale_color_gradient2(high = 'green', mid = "purple", low = "black", midpoint =50)+
  ggplot2::scale_alpha(guide = 'none')+
  ggplot2::scale_size(guide = 'none')+
  ggplot2::scale_y_discrete(labels= c("birth weight", "birth length", "head circumference", "delivery mode (aided)", "induced labor (yes)", "parity (birth before)", "maternal age", "maternal BMI", "maternal hypertension (yes)", "maternal diabetes (yes)", "maternal mental disorders (yes)", "maternal smoking (yes)"))+
  ggplot2::scale_x_continuous(breaks=0:14, labels=)+
  ggplot2::labs(y="predictor", x = "\nnumber of non-zero coefficients", color="%")+
  ggplot2::theme(text = element_text(size = 17), axis.title.x= element_text(size=15), axis.title.y= element_text(size=15), legend.position = "none")
  
p2 <- 
coef_Placenta_male_PREDO_n <- 
  ggplot(pm2_Placenta_male_PREDO_n_coef, aes(y = variable, x=median))+
  geom_point(mapping = ggplot2::aes(y = variable, size =non_zero, alpha = non_zero, color = non_zero))+
  scale_color_gradient2(high = 'green', mid = "purple", low = "black", midpoint =50, limits=c(0,100))+
  scale_alpha(guide = 'none')+
  scale_size(guide = 'none')+
  geom_point()+
  geom_errorbar(aes(y = variable, xmin = lcl, xmax = ucl), width = 0.2)+
  labs(y="", x = "\nmedian & 95% CI of coefficient (over bootstraps)", color="%")+
  scale_x_continuous(limits=c(-0.4,0.4), breaks=c(-.4,-.3,-.2, -.1, 0, .1, .2, .3, .4))+
  scale_y_discrete(labels= c("birth weight", "birth length", "head circumference", "delivery mode (aided)", "induced labor (yes)", "parity (birth before)", "maternal age", "maternal BMI", "maternal hypertension (yes)", "maternal diabetes (yes)", "maternal mental disorders (yes)", "maternal smoking (yes)"))+
  geom_vline(xintercept=0, linetype="dashed")+
  theme_bw()+
  ggtitle("nzero = 5")+
  theme(text = element_text(size = 17), axis.title.x= element_text(size=13), axis.title.y= element_text(size=15), plot.title = element_text(size=15), axis.text.y=element_blank())

g1 <- ggplotGrob(p1)
g2 <- ggplotGrob(p2)
g <- cbind(g1, g2, size = "last")
g$heights <- unit.pmax(g1$heights, g2$heights)

png(filename="Results/Figures/elasticNet_singleTissues/Outcome_add/sex_split/Model_coef_Placenta_PREDO_male.png", width=5800, height=1600, res=400)
grid.draw(g)
dev.off()

to the top

females

```r
# in case you want to start from here
load(\InputData/ClockCalculationsInput/Reg_Input_Data_Placenta_female_PREDO_EAAR_noNa_n.Rdata\)
Reg_Input_Data_Placenta_female_PREDO_EAAR_noNa_n$Child_Sex <- NULL

<!-- rnb-source-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->




<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxueXJjX21hdF9QUkVET19QbGFjZW50YV9mZW1hbGVfbiA8LSBtYXRyaXgoUmVnX0lucHV0X0RhdGFfUGxhY2VudGFfZmVtYWxlX1BSRURPX0VBQVJfbm9OYV9uJEVBQVJfTGVlKVxueHJjX21hdF9QUkVET19QbGFjZW50YV9mZW1hbGVfbiA8LSBtb2RlbC5tYXRyaXgoIH4gLiAtIEVBQVJfTGVlLCBkYXRhID0gUmVnX0lucHV0X0RhdGFfUGxhY2VudGFfZmVtYWxlX1BSRURPX0VBQVJfbm9OYV9uKVssIC0xXVxueXJjX21hdF9QUkVET19zY2FsZWRfUGxhY2VudGFfZmVtYWxlX24gPC0gc2NhbGUoeXJjX21hdF9QUkVET19QbGFjZW50YV9mZW1hbGVfbilcbnhyY19tYXRfUFJFRE9fc2NhbGVkX1BsYWNlbnRhX2ZlbWFsZV9uIDwtIHNjYWxlKHhyY19tYXRfUFJFRE9fUGxhY2VudGFfZmVtYWxlX24pXG5gYGBcbmBgYCJ9 -->

```r
```r
yrc_mat_PREDO_Placenta_female_n <- matrix(Reg_Input_Data_Placenta_female_PREDO_EAAR_noNa_n$EAAR_Lee)
xrc_mat_PREDO_Placenta_female_n <- model.matrix( ~ . - EAAR_Lee, data = Reg_Input_Data_Placenta_female_PREDO_EAAR_noNa_n)[, -1]
yrc_mat_PREDO_scaled_Placenta_female_n <- scale(yrc_mat_PREDO_Placenta_female_n)
xrc_mat_PREDO_scaled_Placenta_female_n <- scale(xrc_mat_PREDO_Placenta_female_n)

<!-- rnb-source-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->


<!-- set seed -->
<!-- ```{r} -->
<!-- set.seed(2020) -->
<!-- ``` -->


<!-- ```{r, warning=F} -->
<!--   nboot = 1000 -->

<!--   bootstraps_Placenta_female_PREDO_n <- replicate(nboot, { -->
<!--     rws <- sample(1:nrow(xrc_mat_PREDO_scaled_Placenta_female_n), replace = TRUE) -->
<!--     ensr(xrc_mat_PREDO_scaled_Placenta_female_n[rws, ], yrc_mat_PREDO_scaled_Placenta_female_n[rws, ], standardized = FALSE, family="gaussian", nlambda=100, nfolds=10, alpha=c(0.0,0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1.0)) -->
<!--   }, -->
<!--   simplify = FALSE) -->
<!-- ``` -->

<!-- ```{r} -->
<!-- save(bootstraps_Placenta_female_PREDO_n, file="InputData/Data_ElasticNets/bootstraps_Placenta_female_PREDO_n_1000.Rdata") -->
<!-- ``` -->



<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxubG9hZChcXElucHV0RGF0YS9EYXRhX0VsYXN0aWNOZXRzL2Jvb3RzdHJhcHNfUGxhY2VudGFfZmVtYWxlX1BSRURPX25fMTAwMC5SZGF0YVxcKVxuYGBgXG5gYGAifQ== -->

```r
```r
load(\InputData/Data_ElasticNets/bootstraps_Placenta_female_PREDO_n_1000.Rdata\)

<!-- rnb-source-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->




<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuc3VtbWFyaWVzX1BsYWNlbnRhX2ZlbWFsZV9QUkVET19uIDwtXG4gIGJvb3RzdHJhcHNfUGxhY2VudGFfZmVtYWxlX1BSRURPX24gJT4lXG4gIGxhcHBseShzdW1tYXJ5KSAlPiVcbiAgcmJpbmRsaXN0KGlkY29sID0gXCJib290c3RyYXBcIilcblxuc3VtbWFyaWVzX1BsYWNlbnRhX2ZlbWFsZV9QUkVET19uXG5gYGAifQ== -->

```r
summaries_Placenta_female_PREDO_n <-
  bootstraps_Placenta_female_PREDO_n %>%
  lapply(summary) %>%
  rbindlist(idcol = "bootstrap")

summaries_Placenta_female_PREDO_n
summaries_Placenta_female_PREDO_n[, .SD[cvm == min(cvm)], by = c("bootstrap", "nzero")] %>%
  ggplot2::ggplot(data = .) +
  ggplot2::aes(x = nzero, y = cvm, group = bootstrap) +
  ggplot2::geom_point() +
  ggplot2::geom_line()
png(filename="Results/Figures/elasticNet_singleTissues/Outcome_add/sex_split/bootstraps_Placenta_PREDO_female.png", width=800, height=600)
summaries_Placenta_female_PREDO_n[, .SD[cvm == min(cvm)], by = c("bootstrap", "nzero")] %>%
  ggplot2::ggplot(data = .) +
  ggplot2::aes(x = nzero, y = cvm, group = bootstrap) +
  ggplot2::geom_point() +
  ggplot2::geom_line()
dev.off()
```r
load(\InputData/Data_ElasticNets/pm2_Placenta_female_PREDO_n.Rdata\)
# coefficient values for the models with smallest cvm by number of non-erzo coefficients and bootstrap

<!-- rnb-source-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->





<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuY3N1bW1hcnlfUGxhY2VudGFfZmVtYWxlX1BSRURPX24gPC0gUmVkdWNlKGZ1bmN0aW9uKHgseSkgbWVyZ2UoeCA9IHgsIHkgPSB5LCBieSA9IFwibnplcm9cIiksIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0KHBtMl9QbGFjZW50YV9mZW1hbGVfUFJFRE9fblssIGxhcHBseSguU0QsIGZ1bmN0aW9uKHgpIHttZWFuKHggIT0gMCl9KSwgLlNEY29scyA9IGMoXCJCaXJ0aF9XZWlnaHRcIiwgXCJCaXJ0aF9MZW5ndGhcIiwgXCJIZWFkX0NpcmN1bWZlcmVuY2VfYXRfQmlydGhcIiwgXCJEZWxpdmVyeV9Nb2RlX2RpY2hvdG9tYWlkZWRcIiwgXCJpbmR1Y2VkbGFib3VyWWVzXCIsIFwiUGFyaXR5X2RpY2hvdG9tZ2l2ZW4gYmlydGggYmVmb3JlXCIsIFwiTWF0ZXJuYWxfQWdlXzE4UG9wUmVnYW5kQlJcIiwgXCJNYXRlcm5hbF9QcmVwcmVnbmFuY3lCTUkxOG9jdDI4bmV3XCIsIFwibWF0ZXJuYWxfaHlwZXJ0ZW5zaW9uX2RpY2hvdG9taHlwZXJ0ZW5zaW9uIGluIGN1cnJlbnQgcHJlZ25hbmN5XCIsXCJtYXRlcm5hbF9kaWFiZXRlc19kaWNob3RvbWRpYWJldGVzIGluIGN1cnJlbnQgcHJlZ25hbmN5XCIsXCJNYXRlcm5hbF9NZW50YWxfRGlzb3JkZXJzX0J5X0NoaWxkYmlydGhZZXNcIixcInNtb2tpbmdfZGljaG90b215ZXNcIiksIGJ5ID0gbnplcm9dXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBtMl9QbGFjZW50YV9mZW1hbGVfUFJFRE9fblssIC4obWVhbl9jdm0gPSBtZWFuKGN2bSkpLCBieSA9IG56ZXJvXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbTJfUGxhY2VudGFfZmVtYWxlX1BSRURPX25bLCAuKG1lZGlhbl9jdm0gPSBtZWRpYW4oY3ZtKSksIGJ5ID0gbnplcm9dXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkpW29yZGVyKG56ZXJvKV1cblxuY3N1bW1hcnlfUGxhY2VudGFfZmVtYWxlX1BSRURPX25cbmBgYCJ9 -->

```r
csummary_Placenta_female_PREDO_n <- Reduce(function(x,y) merge(x = x, y = y, by = "nzero"), 
                                         list(pm2_Placenta_female_PREDO_n[, lapply(.SD, function(x) {mean(x != 0)}), .SDcols = c("Birth_Weight", "Birth_Length", "Head_Circumference_at_Birth", "Delivery_Mode_dichotomaided", "inducedlabourYes", "Parity_dichotomgiven birth before", "Maternal_Age_18PopRegandBR", "Maternal_PrepregnancyBMI18oct28new", "maternal_hypertension_dichotomhypertension in current pregnancy","maternal_diabetes_dichotomdiabetes in current pregnancy","Maternal_Mental_Disorders_By_ChildbirthYes","smoking_dichotomyes"), by = nzero]
                                              ,
                                              pm2_Placenta_female_PREDO_n[, .(mean_cvm = mean(cvm)), by = nzero],
                                              pm2_Placenta_female_PREDO_n[, .(median_cvm = median(cvm)), by = nzero]
                                         ))[order(nzero)]

csummary_Placenta_female_PREDO_n
g1_Placenta_female_PREDO_n <-
  csummary_Placenta_female_PREDO_n %>%
  melt(id.vars = c("nzero", "mean_cvm", "median_cvm")) %>%
  ggplot2::ggplot(.) +
  ggplot2::theme_bw() +
  ggplot2::aes(x = nzero) +
  ggplot2::geom_point(mapping = ggplot2::aes(y = variable, size = value, alpha = value, color = value*100)) +
  ggplot2::scale_color_gradient2(high = 'green', mid = "purple", low = "black", midpoint =50)+
  ggplot2::scale_alpha(guide = 'none')+
  ggplot2::scale_size(guide = 'none')+
  ggplot2::scale_y_discrete(labels= c("birth weight", "birth length", "head circumference", "delivery mode", "induced labor", "parity", "maternal age", "maternal BMI", "maternal hypertension", "maternal diabetes", "maternal mental disorders", "maternal smoking"))+
  ggplot2::scale_x_continuous(breaks=0:14, labels=)+
  ggplot2::labs(y="predictor", x = "number of non-zero coefficients", color="%")+
  ggplot2::theme(text = element_text(size = 15), axis.title.x= element_text(size=15), axis.title.y= element_text(size=15))

g2_Placenta_female_PREDO_n <-
  csummary_Placenta_female_PREDO_n %>%
  ggplot2::ggplot(.) +
  ggplot2::theme_bw() +
  ggplot2::aes(x = nzero, y = median_cvm) +
  ggplot2::geom_point() + ggplot2::geom_line()+
  ggplot2::labs(y="median cvm", x = "number of non-zero coefficients")+
  ggplot2::scale_x_continuous(breaks=0:14, labels=)+
  ggplot2::theme(axis.text=element_text(size=15),axis.title=element_text(size=18))

gridExtra::grid.arrange(g1_Placenta_female_PREDO_n, g2_Placenta_female_PREDO_n, ncol = 1)
png(filename="Results/Figures/elasticNet_singleTissues/Outcome_add/sex_split/bootstrapModels_Placenta_PREDO_female.png", width=2400, height=1800, res=300)
gridExtra::grid.arrange(g1_Placenta_female_PREDO_n, g2_Placenta_female_PREDO_n, ncol = 1)
dev.off()
png(filename="Results/Figures/elasticNet_singleTissues/Outcome_add/sex_split/Model_Placenta_PREDO_female.png", width=2800, height=1400, res=400)
g1_Placenta_female_PREDO_n
dev.off()
elbow_finder(csummary_Placenta_female_PREDO_n$nzero, csummary_Placenta_female_PREDO_n$median_cvm)

nzero_indices_Cord <- data.frame(t(elbow_finder(csummary_Placenta_female_PREDO_n$nzero, csummary_Placenta_female_PREDO_n$median_cvm)))
colnames(nzero_indices_Cord) <- c("x", "y")
rownames(nzero_indices_Cord) <- NULL
```r
nzero_final_placenta_female <- 6

<!-- rnb-source-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->




<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuY3N1bW1hcnlfUGxhY2VudGFfZmVtYWxlX1BSRURPX25bbnplcm8gJWluJSBuemVyb19maW5hbF9wbGFjZW50YV9mZW1hbGVdXG5gYGAifQ== -->

```r
csummary_Placenta_female_PREDO_n[nzero %in% nzero_final_placenta_female]
nonzero_choose_Placenta_female <- ggplot2::ggplot(csummary_Placenta_female_PREDO_n) +
  ggplot2::theme_bw()+
  ggplot2::aes(x = nzero, y = median_cvm) +
  ggplot2::scale_x_continuous(breaks=c(0:17))+
  ggplot2::geom_point() + ggplot2::geom_line()+
  ggplot2::geom_point(data=nzero_indices_Cord, aes(x=x, y=y), colour="red", size=2)+
  ggplot2::ylab("median of minimum cross-validation errors over bootstraps")+
  ggplot2::xlab("number of non-zero coefficients")+
  ggplot2::geom_segment(aes(x = nzero[1], y = median_cvm[1], xend = nzero[13], yend = median_cvm[13], colour = "segment"), data = csummary_Placenta_female_PREDO_n, show.legend = F)

nonzero_choose_Placenta_female
png(filename="Results/Figures/elasticNet_singleTissues/Outcome_add/sex_split/nzero_choose_Placenta_PREDO_female.png", width=1600, height=1400, res=300)
nonzero_choose_Placenta_female
dev.off()
```r
summary_Placenta_female_PREDO_n_finalnzero <- csummary_Placenta_female_PREDO_n[nzero %in% nzero_final_placenta_female]
sig_var_names_Placenta_female_PREDO_n_finalnzero <- Filter(function(x) any(x > 0.75), summary_Placenta_female_PREDO_n_finalnzero[,!c(\nzero\, \mean_cvm\, \median_cvm\)]) %>% colnames()
colnames(summary_Placenta_female_PREDO_n_finalnzero) <- c(\non-zero\, \birth weight\, \birth length\, \head circumference\, \delivery mode (aided)\, \induced labor (yes)\, \parity (birth before)\, \maternal age\, \maternal BMI\, \maternal hypertension (yes)\, \maternal diabetes (yes)\, \maternal mental disorders (yes)\, \maternal smoking (yes)\, \mean cvm\, \median cvm\)
summary_Placenta_female_PREDO_n_finalnzeroT <- as.data.frame(t(summary_Placenta_female_PREDO_n_finalnzero[,-c(\non-zero\, \median cvm\, \mean cvm\)]))
summary_Placenta_female_PREDO_n_finalnzeroT$variable <- rownames(summary_Placenta_female_PREDO_n_finalnzeroT)
rownames(summary_Placenta_female_PREDO_n_finalnzeroT) <- NULL
names(summary_Placenta_female_PREDO_n_finalnzeroT)[names(summary_Placenta_female_PREDO_n_finalnzeroT) == 'V1'] <- 'percent'
summary_Placenta_female_PREDO_n_finalnzeroT <- summary_Placenta_female_PREDO_n_finalnzeroT[order(summary_Placenta_female_PREDO_n_finalnzeroT$percent),]

summary_Placenta_female_PREDO_n_finalnzeroT$number <- seq(1, length(summary_Placenta_female_PREDO_n_finalnzeroT$variable))

<!-- rnb-source-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->



<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxucGVyY192YXJzX1BsYWNlbnRhX2ZlbWFsZV9QUkVET19uIDwtIFxuICBnZ3Bsb3Qoc3VtbWFyeV9QbGFjZW50YV9mZW1hbGVfUFJFRE9fbl9maW5hbG56ZXJvVCwgYWVzKHJlb3JkZXIodmFyaWFibGUsIHBlcmNlbnQpLCBwZXJjZW50LCBncm91cD0xKSkrXG4gIGdlb21fcG9pbnQoKSsgZ2VvbV9saW5lKCkrXG4gIHlsYWIoXCIlIG9jY3VyZW5jZSBpbiBtb2RlbHMgd2l0aCBuemVybyBjb2VmZmljaWVudHMgPSA0XCIpK1xuICBzY2FsZV95X2NvbnRpbnVvdXMoYnJlYWtzPWMoMC4xLDAuMiwwLjMsMC40LDAuNSwwLjYsMC43LDAuOCwwLjkpKStcbiAgeGxhYihcInZhcmlhYmxlXCIpK1xuICBjb29yZF9mbGlwKCkrXG4gIGdlb21faGxpbmUoeWludGVyY2VwdD0wLjc1LCBsaW5ldHlwZT1cImRvdHRlZFwiKStcbiAgdGhlbWVfYncoKVxuXG5wZXJjX3ZhcnNfUGxhY2VudGFfZmVtYWxlX1BSRURPX25cblxuIyBkZWNpZGUgZm9yIGN1dC1vZmYgJSAtPiBoZXJlIC43NVxuXG5GaWx0ZXIoZnVuY3Rpb24oeCkgYW55KHggPiAwLjc1KSwgc3VtbWFyeV9QbGFjZW50YV9mZW1hbGVfUFJFRE9fbl9maW5hbG56ZXJvWywhYyhcIm5vbi16ZXJvXCIsIFwibWVhbiBjdm1cIiwgXCJtZWRpYW4gY3ZtXCIpXSlcblxuYGBgIn0= -->

```r
perc_vars_Placenta_female_PREDO_n <- 
  ggplot(summary_Placenta_female_PREDO_n_finalnzeroT, aes(reorder(variable, percent), percent, group=1))+
  geom_point()+ geom_line()+
  ylab("% occurence in models with nzero coefficients = 4")+
  scale_y_continuous(breaks=c(0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9))+
  xlab("variable")+
  coord_flip()+
  geom_hline(yintercept=0.75, linetype="dotted")+
  theme_bw()

perc_vars_Placenta_female_PREDO_n

# decide for cut-off % -> here .75

Filter(function(x) any(x > 0.75), summary_Placenta_female_PREDO_n_finalnzero[,!c("non-zero", "mean cvm", "median cvm")])
png(filename="Results/Figures/elasticNet_singleTissues/Outcome_add/sex_split/varsPercent_Placenta_female.png", width=1100, height=1400, res=300)
perc_vars_Placenta_female_PREDO_n
dev.off()
pm2_Placenta_female_PREDO_n_coef <-
  dcast(pm2_Placenta_female_PREDO_n[,
                                  as.list(unlist(
                                    lapply(.SD,
                                           function(x) {
                                             y <- unname(quantile(x[x != 0], probs = c(0.025, 0.975)))
                                             list("non_zero" = 100 * mean(x != 0),
                                                  lcl = y[1],
                                                  ucl = y[2],
                                                  width = diff(y),
                                                  median = median(x[x!= 0]))
                                           }))),
                                  .SDcols = c("Birth_Weight", "Birth_Length", "Head_Circumference_at_Birth", "Delivery_Mode_dichotomaided", "inducedlabourYes", "Parity_dichotomgiven birth before", "Maternal_Age_18PopRegandBR", "Maternal_PrepregnancyBMI18oct28new", "maternal_hypertension_dichotomhypertension in current pregnancy","maternal_diabetes_dichotomdiabetes in current pregnancy","Maternal_Mental_Disorders_By_ChildbirthYes","smoking_dichotomyes"),
                                  by = nzero][order(nzero)] %>%
          melt(id.var = "nzero") %>%
          .[, metric := sub("^.+\\.(.+)$", "\\1", variable)] %>%
          .[, variable := sub("^(.+)\\..+$", "\\1", variable)] %>%
          .[nzero ==nzero_final_placenta_female], nzero+ variable ~ metric, value.var="value")

# get desired order of predictors
pm2_Placenta_female_PREDO_n_coef <-
  pm2_Placenta_female_PREDO_n_coef[match(c("Birth_Weight", "Birth_Length", "Head_Circumference_at_Birth", "Delivery_Mode_dichotomaided", "inducedlabourYes", "Parity_dichotomgiven birth before", "Maternal_Age_18PopRegandBR", "Maternal_PrepregnancyBMI18oct28new", "maternal_hypertension_dichotomhypertension in current pregnancy","maternal_diabetes_dichotomdiabetes in current pregnancy","Maternal_Mental_Disorders_By_ChildbirthYes","smoking_dichotomyes"), pm2_Placenta_female_PREDO_n_coef$variable),]
pm2_Placenta_female_PREDO_n_coef$variable <- factor(pm2_Placenta_female_PREDO_n_coef$variabl, levels=unique(pm2_Placenta_female_PREDO_n_coef$variable))

## NOTE: median is used here instead of mean
# make frame for only significant variables:
pm2_Placenta_female_PREDO_n_datable <- dcast(pm2_Placenta_female_PREDO_n[,
                                                                     as.list(unlist(
                                                                       lapply(.SD,
                                                                              function(x) {
                                                                                y <- unname(quantile(x[x != 0], probs = c(0.025, 0.975)))
                                                                                list("non_zero" = 100 * mean(x != 0),
                                                                                     lcl = y[1],
                                                                                     ucl = y[2],
                                                                                     width = diff(y),
                                                                                     median = median(x[x!= 0]))
                                                                              }))),
                                                                     .SDcols = c("Birth_Weight", "Birth_Length", "Head_Circumference_at_Birth", "Delivery_Mode_dichotomaided", "inducedlabourYes", "Parity_dichotomgiven birth before", "Maternal_Age_18PopRegandBR", "Maternal_PrepregnancyBMI18oct28new", "maternal_hypertension_dichotomhypertension in current pregnancy","maternal_diabetes_dichotomdiabetes in current pregnancy","Maternal_Mental_Disorders_By_ChildbirthYes","smoking_dichotomyes"),
                                                                     by = nzero][order(nzero)] %>%
                                             melt(id.var = "nzero") %>%
                                             .[, metric := sub("^.+\\.(.+)$", "\\1", variable)] %>%
                                             .[, variable := sub("^(.+)\\..+$", "\\1", variable)] %>%
                                             # print %>%
                                             .[nzero == nzero_final_placenta_female & variable %in% sig_var_names_Placenta_female_PREDO_n_finalnzero], nzero+ variable ~ metric, value.var="value")

pm2_Placenta_female_PREDO_n_datable
```r
sig_vars_Placenta_female_PREDO_n <-
  pm2_Placenta_female_PREDO_n_coef %>%
  ggplot2::ggplot(.) +
  ggplot2::theme_bw() +
  ggplot2::theme(axis.text.x=element_blank())+
  ggplot2::aes(x=\nzero\)+
  ggplot2::geom_point(mapping = ggplot2::aes(y = variable, size =non_zero, alpha = non_zero, color = non_zero)) +
  ggplot2::geom_text(aes(y=variable, label=sprintf(\%0.2f\, round(median, digits=2)), size=50),hjust=0, vjust=0.5, nudge_x = 0.1)+
  ggplot2::scale_color_gradient2(high = 'green', mid = \purple\, low = \black\, midpoint =50)+
  ggplot2::scale_alpha(guide = 'none')+
  ggplot2::scale_size(guide = 'none')+
  ggplot2::scale_y_discrete(labels= c(\birth weight\, \birth length\, \head circumference\, \delivery mode (aided)\, \induced labor (yes)\, \parity (birth before)\, \maternal age\, \maternal BMI\, \maternal hypertension (yes)\, \maternal diabetes (yes)\, \maternal mental disorders (yes)\, \maternal smoking (yes)\))+
  ggplot2::labs(y=\predictor\, x = \number of non-zero coefficients = 6\, color=\%\)

<!-- rnb-source-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->



<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuY29lZl9QbGFjZW50YV9mZW1hbGVfUFJFRE9fbiA8LSBcbiAgZ2dwbG90KHBtMl9QbGFjZW50YV9mZW1hbGVfUFJFRE9fbl9jb2VmLCBhZXMoeSA9IHZhcmlhYmxlLCB4PW1lZGlhbikpK1xuICBnZW9tX3BvaW50KG1hcHBpbmcgPSBnZ3Bsb3QyOjphZXMoeSA9IHZhcmlhYmxlLCBzaXplID1ub25femVybywgYWxwaGEgPSBub25femVybywgY29sb3IgPSBub25femVybykpK1xuICBzY2FsZV9jb2xvcl9ncmFkaWVudDIoaGlnaCA9ICdncmVlbicsIG1pZCA9IFwicHVycGxlXCIsIGxvdyA9IFwiYmxhY2tcIiwgbWlkcG9pbnQgPTUwLCBsaW1pdHM9YygwLDEwMCkpK1xuICBzY2FsZV9hbHBoYShndWlkZSA9ICdub25lJykrXG4gIHNjYWxlX3NpemUoZ3VpZGUgPSAnbm9uZScpK1xuICBnZW9tX3BvaW50KCkrXG4gIGdlb21fZXJyb3JiYXIoYWVzKHkgPSB2YXJpYWJsZSwgeG1pbiA9IGxjbCwgeG1heCA9IHVjbCksIHdpZHRoID0gMC4yKStcbiAgbGFicyh5PVwicHJlZGljdG9yXCIsIHggPSBcIlxcbm1lZGlhbiAmIDk1JSBDSSBvZiBjb2VmZmljaWVudCAob3ZlciBib290c3RyYXBzKVwiLCBjb2xvcj1cIiVcIikrXG4gIHNjYWxlX3hfY29udGludW91cyhsaW1pdHM9YygtMC41LDAuNCksIGJyZWFrcz1jKC0uNCwtLjMsLS4yLCAtLjEsIDAsIC4xLCAuMiwgLjMsIC40KSkrXG4gIHNjYWxlX3lfZGlzY3JldGUobGFiZWxzPSBjKFwiYmlydGggd2VpZ2h0XCIsIFwiYmlydGggbGVuZ3RoXCIsIFwiaGVhZCBjaXJjdW1mZXJlbmNlXCIsIFwiZGVsaXZlcnkgbW9kZSAoYWlkZWQpXCIsIFwiaW5kdWNlZCBsYWJvciAoeWVzKVwiLCBcInBhcml0eSAoYmlydGggYmVmb3JlKVwiLCBcIm1hdGVybmFsIGFnZVwiLCBcIm1hdGVybmFsIEJNSVwiLCBcIm1hdGVybmFsIGh5cGVydGVuc2lvbiAoeWVzKVwiLCBcIm1hdGVybmFsIGRpYWJldGVzICh5ZXMpXCIsIFwibWF0ZXJuYWwgbWVudGFsIGRpc29yZGVycyAoeWVzKVwiLCBcIm1hdGVybmFsIHNtb2tpbmcgKHllcylcIikpK1xuICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQ9MCwgbGluZXR5cGU9XCJkYXNoZWRcIikrXG4gIHRoZW1lX2J3KCkrXG4gIHRoZW1lKHRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE1KSwgYXhpcy50aXRsZS54PSBlbGVtZW50X3RleHQoc2l6ZT0xNSksIGF4aXMudGl0bGUueT0gZWxlbWVudF90ZXh0KHNpemU9MTUpKVxuXG5cbmNvZWZfUGxhY2VudGFfZmVtYWxlX1BSRURPX25cbmBgYCJ9 -->

```r
coef_Placenta_female_PREDO_n <- 
  ggplot(pm2_Placenta_female_PREDO_n_coef, aes(y = variable, x=median))+
  geom_point(mapping = ggplot2::aes(y = variable, size =non_zero, alpha = non_zero, color = non_zero))+
  scale_color_gradient2(high = 'green', mid = "purple", low = "black", midpoint =50, limits=c(0,100))+
  scale_alpha(guide = 'none')+
  scale_size(guide = 'none')+
  geom_point()+
  geom_errorbar(aes(y = variable, xmin = lcl, xmax = ucl), width = 0.2)+
  labs(y="predictor", x = "\nmedian & 95% CI of coefficient (over bootstraps)", color="%")+
  scale_x_continuous(limits=c(-0.5,0.4), breaks=c(-.4,-.3,-.2, -.1, 0, .1, .2, .3, .4))+
  scale_y_discrete(labels= c("birth weight", "birth length", "head circumference", "delivery mode (aided)", "induced labor (yes)", "parity (birth before)", "maternal age", "maternal BMI", "maternal hypertension (yes)", "maternal diabetes (yes)", "maternal mental disorders (yes)", "maternal smoking (yes)"))+
  geom_vline(xintercept=0, linetype="dashed")+
  theme_bw()+
  theme(text = element_text(size = 15), axis.title.x= element_text(size=15), axis.title.y= element_text(size=15))


coef_Placenta_female_PREDO_n
png(filename="Results/Figures/elasticNet_singleTissues/Outcome_add/sex_split/coef_Placenta_PREDO_female.png", width=2800, height=1400, res=400)
coef_Placenta_female_PREDO_n
dev.off()
p1 <-
  csummary_Placenta_female_PREDO_n %>%
  melt(id.vars = c("nzero", "mean_cvm", "median_cvm")) %>%
  ggplot2::ggplot(.) +
  ggplot2::theme_bw() +
  ggplot2::aes(x = nzero) +
  ggplot2::geom_point(mapping = ggplot2::aes(y = variable, size = value, alpha = value, color = value*100)) +
  ggplot2::scale_color_gradient2(high = 'green', mid = "purple", low = "black", midpoint =50)+
  ggplot2::scale_alpha(guide = 'none')+
  ggplot2::scale_size(guide = 'none')+
  ggplot2::scale_y_discrete(labels= c("birth weight", "birth length", "head circumference", "delivery mode (aided)", "induced labor (yes)", "parity (birth before)", "maternal age", "maternal BMI", "maternal hypertension (yes)", "maternal diabetes (yes)", "maternal mental disorders (yes)", "maternal smoking (yes)"))+
  ggplot2::scale_x_continuous(breaks=0:14, labels=)+
  ggplot2::labs(y="predictor", x = "\nnumber of non-zero coefficients", color="%")+
  ggplot2::theme(text = element_text(size = 17), axis.title.x= element_text(size=15), axis.title.y= element_text(size=15), legend.position = "none")
  
p2 <- 
coef_Placenta_male_PREDO_n <- 
  ggplot(pm2_Placenta_female_PREDO_n_coef, aes(y = variable, x=median))+
  geom_point(mapping = ggplot2::aes(y = variable, size =non_zero, alpha = non_zero, color = non_zero))+
  scale_color_gradient2(high = 'green', mid = "purple", low = "black", midpoint =50, limits=c(0,100))+
  scale_alpha(guide = 'none')+
  scale_size(guide = 'none')+
  geom_point()+
  geom_errorbar(aes(y = variable, xmin = lcl, xmax = ucl), width = 0.2)+
  labs(y="", x = "\nmedian & 95% CI of coefficient (over bootstraps)", color="%")+
  scale_x_continuous(limits=c(-0.5,0.4), breaks=c(-.4,-.3,-.2, -.1, 0, .1, .2, .3, .4))+
  scale_y_discrete(labels= c("birth weight", "birth length", "head circumference", "delivery mode (aided)", "induced labor (yes)", "parity (birth before)", "maternal age", "maternal BMI", "maternal hypertension (yes)", "maternal diabetes (yes)", "maternal mental disorders (yes)", "maternal smoking (yes)"))+
  geom_vline(xintercept=0, linetype="dashed")+
  theme_bw()+
  ggtitle("nzero = 6")+
  theme(text = element_text(size = 17), axis.title.x= element_text(size=15), axis.title.y= element_text(size=15), plot.title = element_text(size=15), axis.text.y=element_blank())

g1 <- ggplotGrob(p1)
g2 <- ggplotGrob(p2)
g <- cbind(g1, g2, size = "last")
g$heights <- unit.pmax(g1$heights, g2$heights)

png(filename="Results/Figures/elasticNet_singleTissues/Outcome_add/sex_split/Model_coef_Placenta_PREDO_female.png", width=5800, height=1600, res=400)
grid.draw(g)
dev.off()

to the top

Prediction in PREDO cord blood

ifelse(!dir.exists(file.path(getwd(), "Results/Figures/predPREDO")), dir.create(file.path(getwd(), "Results/Figures/predPREDO")), FALSE)

load PREDO data EPIC

```r
load(\InputData/ClockCalculationsInput/Reg_Input_Data_Cordblood_PREDO_EAAR_noNa_n.Rdata\)

<!-- rnb-source-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->


load PREDO data 450K

<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxubG9hZChcXElucHV0RGF0YS9DbG9ja0NhbGN1bGF0aW9uc0lucHV0L1JlZ19JbnB1dF9EYXRhX0NvcmRibG9vZF9QUkVETzQ1MEtfRUFBUl9ub05hX24uUmRhdGFcXClcbmBgYFxuYGBgIn0= -->

```r
```r
load(\InputData/ClockCalculationsInput/Reg_Input_Data_Cordblood_PREDO450K_EAAR_noNa_n.Rdata\)

<!-- rnb-source-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->


load beta values from ITU

<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxubG9hZChcIklucHV0RGF0YS9EYXRhX0VsYXN0aWNOZXRzL0JldGFfQ29yZF9JVFVfbi5SZGF0YVwiKVxuQmV0YV9Db3JkX0lUVV9uXG5gYGAifQ== -->

```r
load("InputData/Data_ElasticNets/Beta_Cord_ITU_n.Rdata")
Beta_Cord_ITU_n

prepare PREDO data EPIC

```r
y_mat_PREDO_Cord_pred <- matrix(Reg_Input_Data_Cordblood_PREDO_EAAR_noNa_n$EAAR_Bohlin)

Reg_Input_Data_Cordblood_PREDO_EAAR_noNa_vars <- Reg_Input_Data_Cordblood_PREDO_EAAR_noNa_n[ ,c(\Child_Sex\, \Birth_Length\, \Delivery_Mode_dichotom\, \Maternal_Mental_Disorders_By_Childbirth\, \smoking_dichotom\)]

x_mat_PREDO_Cord_pred <- model.matrix(~ ., data= Reg_Input_Data_Cordblood_PREDO_EAAR_noNa_vars)[, -1]

y_mat_PREDO_scaled_Cord_pred <- scale(y_mat_PREDO_Cord_pred)

x_mat_PREDO_scaled_Cord_pred <- scale(x_mat_PREDO_Cord_pred)
x_mat_PREDO_scaled_Cord_pred <- cbind(1, x_mat_PREDO_scaled_Cord_pred)
colnames(x_mat_PREDO_scaled_Cord_pred) <- c(\Intercept\, \child sex\, \birth length\, \delivery mode\, \maternal mental disorders\, \maternal smoking\)

<!-- rnb-source-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->


prepare PREDO data 450K

<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxueV9tYXRfUFJFRE9fQ29yZF9wcmVkSyA8LSBtYXRyaXgoUmVnX0lucHV0X0RhdGFfQ29yZGJsb29kX1BSRURPNDUwS19FQUFSX25vTmFfbiRFQUFSX0JvaGxpbilcblxuUmVnX0lucHV0X0RhdGFfQ29yZGJsb29kX1BSRURPX0VBQVJfbm9OYV92YXJzSyA8LSBSZWdfSW5wdXRfRGF0YV9Db3JkYmxvb2RfUFJFRE80NTBLX0VBQVJfbm9OYV9uWyAsYyhcXENoaWxkX1NleFxcLCBcXEJpcnRoX0xlbmd0aFxcLCBcXERlbGl2ZXJ5X01vZGVfZGljaG90b21cXCwgIFxcTWF0ZXJuYWxfTWVudGFsX0Rpc29yZGVyc19CeV9DaGlsZGJpcnRoXFwsIFxcc21va2luZ19kaWNob3RvbVxcKV1cblxueF9tYXRfUFJFRE9fQ29yZF9wcmVkSyA8LSBtb2RlbC5tYXRyaXgofiAuLCBkYXRhPSBSZWdfSW5wdXRfRGF0YV9Db3JkYmxvb2RfUFJFRE9fRUFBUl9ub05hX3ZhcnNLKVssIC0xXVxuXG55X21hdF9QUkVET19zY2FsZWRfQ29yZF9wcmVkSyA8LSBzY2FsZSh5X21hdF9QUkVET19Db3JkX3ByZWRLKVxuXG54X21hdF9QUkVET19zY2FsZWRfQ29yZF9wcmVkSyA8LSBzY2FsZSh4X21hdF9QUkVET19Db3JkX3ByZWRLKVxueF9tYXRfUFJFRE9fc2NhbGVkX0NvcmRfcHJlZEsgPC0gY2JpbmQoMSwgeF9tYXRfUFJFRE9fc2NhbGVkX0NvcmRfcHJlZEspXG5jb2xuYW1lcyh4X21hdF9QUkVET19zY2FsZWRfQ29yZF9wcmVkSykgPC0gYyhcXEludGVyY2VwdFxcLCBcXGNoaWxkIHNleFxcLCBcXGJpcnRoIGxlbmd0aFxcLCBcXGRlbGl2ZXJ5IG1vZGVcXCxcXG1hdGVybmFsIG1lbnRhbCBkaXNvcmRlcnNcXCwgXFxtYXRlcm5hbCBzbW9raW5nXFwpXG5gYGBcbmBgYCJ9 -->

```r
```r
y_mat_PREDO_Cord_predK <- matrix(Reg_Input_Data_Cordblood_PREDO450K_EAAR_noNa_n$EAAR_Bohlin)

Reg_Input_Data_Cordblood_PREDO_EAAR_noNa_varsK <- Reg_Input_Data_Cordblood_PREDO450K_EAAR_noNa_n[ ,c(\Child_Sex\, \Birth_Length\, \Delivery_Mode_dichotom\,  \Maternal_Mental_Disorders_By_Childbirth\, \smoking_dichotom\)]

x_mat_PREDO_Cord_predK <- model.matrix(~ ., data= Reg_Input_Data_Cordblood_PREDO_EAAR_noNa_varsK)[, -1]

y_mat_PREDO_scaled_Cord_predK <- scale(y_mat_PREDO_Cord_predK)

x_mat_PREDO_scaled_Cord_predK <- scale(x_mat_PREDO_Cord_predK)
x_mat_PREDO_scaled_Cord_predK <- cbind(1, x_mat_PREDO_scaled_Cord_predK)
colnames(x_mat_PREDO_scaled_Cord_predK) <- c(\Intercept\, \child sex\, \birth length\, \delivery mode\,\maternal mental disorders\, \maternal smoking\)

<!-- rnb-source-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->


matrix multiplication EPIC

<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxuI1k9WCpCXG55X3ByZWRfUFJFRE9fY29yZCA8LSB4X21hdF9QUkVET19zY2FsZWRfQ29yZF9wcmVkICUqJSBCZXRhX0NvcmRfSVRVX25cbmBgYFxuYGBgIn0= -->

```r
```r
#Y=X*B
y_pred_PREDO_cord <- x_mat_PREDO_scaled_Cord_pred %*% Beta_Cord_ITU_n

<!-- rnb-source-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->


matrix multiplication 450K

<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxuI1k9WCpCXG55X3ByZWRfUFJFRE9fY29yZEsgPC0geF9tYXRfUFJFRE9fc2NhbGVkX0NvcmRfcHJlZEsgJSolIEJldGFfQ29yZF9JVFVfblxuYGBgXG5gYGAifQ== -->

```r
```r
#Y=X*B
y_pred_PREDO_cordK <- x_mat_PREDO_scaled_Cord_predK %*% Beta_Cord_ITU_n

<!-- rnb-source-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->


data EPIC

<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxuUFJFRE9fY29yZF9wcmVkX2V4cF9yZWFsIDwtIGRhdGEuZnJhbWUoY2JpbmQoeV9wcmVkX1BSRURPX2NvcmQsIHlfbWF0X1BSRURPX3NjYWxlZF9Db3JkX3ByZWQpKVxubmFtZXMoUFJFRE9fY29yZF9wcmVkX2V4cF9yZWFsKSA8LSBjKFxccHJlZGljdGVkX0VBQVJcXCwgXFxyZWFsX0VBQVJcXClcbmBgYFxuYGBgIn0= -->

```r
```r
PREDO_cord_pred_exp_real <- data.frame(cbind(y_pred_PREDO_cord, y_mat_PREDO_scaled_Cord_pred))
names(PREDO_cord_pred_exp_real) <- c(\predicted_EAAR\, \real_EAAR\)

<!-- rnb-source-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->


data 450K

<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxuUFJFRE9fY29yZF9wcmVkX2V4cF9yZWFsSyA8LSBkYXRhLmZyYW1lKGNiaW5kKHlfcHJlZF9QUkVET19jb3JkSywgeV9tYXRfUFJFRE9fc2NhbGVkX0NvcmRfcHJlZEspKVxubmFtZXMoUFJFRE9fY29yZF9wcmVkX2V4cF9yZWFsSykgPC0gYyhcXHByZWRpY3RlZF9FQUFSXFwsIFxccmVhbF9FQUFSXFwpXG5gYGBcbmBgYCJ9 -->

```r
```r
PREDO_cord_pred_exp_realK <- data.frame(cbind(y_pred_PREDO_cordK, y_mat_PREDO_scaled_Cord_predK))
names(PREDO_cord_pred_exp_realK) <- c(\predicted_EAAR\, \real_EAAR\)

<!-- rnb-source-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->


cor EPIC

<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuY29yLnRlc3QoUFJFRE9fY29yZF9wcmVkX2V4cF9yZWFsJHByZWRpY3RlZF9FQUFSLFBSRURPX2NvcmRfcHJlZF9leHBfcmVhbCRyZWFsX0VBQVIsIGFsdGVybmF0aXZlPVwiZ3JlYXRlclwiKVxuIyBuID0gMTQ0XG5cbnBsb3RfcHJlZF9yZWFsX2VwaWMgPC0gZ2dzY2F0dGVyKFBSRURPX2NvcmRfcHJlZF9leHBfcmVhbCwgeCA9IFwicHJlZGljdGVkX0VBQVJcIiwgeSA9IFwicmVhbF9FQUFSXCIsIFxuICAgICAgICAgIGFkZCA9IFwicmVnLmxpbmVcIiwgY29uZi5pbnQgPSBUUlVFLCBcbiAgICAgICAgICAjY29yLmNvZWYgPSBUUlVFLCBjb3IubWV0aG9kID0gXCJwZWFyc29uXCIsXG4gICAgICAgICAgeGxhYiA9IFwicHJlZGljdGVkIEVBQVJcIiwgeWxhYiA9IFwidHJ1ZSBFQUFSXCIsIHN1YnRpdGxlPVwiUFJFRE8gRVBJQyAobj0xNDQpXCIpK1xuICAgc3RhdF9jb3IobGFiZWwueCA9IC0wLjQsIGxhYmVsLnk9MyxwLmFjY3VyYWN5ID0gMC4wMDEsIHIuYWNjdXJhY3kgPSAwLjAxLCBhbHRlcm5hdGl2ZT1cImdyZWF0ZXJcIikrXG4gIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemU9OSksIGF4aXMudGV4dC55PWVsZW1lbnRfdGV4dChzaXplPTkpLCBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoc2l6ZT0xMiksIGF4aXMudGl0bGUueD1lbGVtZW50X3RleHQoc2l6ZT0xMiksXG4gIHBhbmVsLmdyaWQubWFqb3IgPSBlbGVtZW50X2JsYW5rKCksXG4gIHBhbmVsLmdyaWQubWlub3IgPSBlbGVtZW50X2JsYW5rKCkpICtcbiAgc2NhbGVfeV9jb250aW51b3VzKGxpbWl0cyA9IGMoLTMsMyksIGJyZWFrcyA9IHNlcSgtMywzLCBieT0xKSkrXG4gIHNjYWxlX3hfY29udGludW91cyhsaW1pdHMgPSBjKC0wLjQsMC42KSwgYnJlYWtzID0gc2VxKC0wLjQsMC42LCBieT0wLjIpKVxuYGBgIn0= -->

```r
cor.test(PREDO_cord_pred_exp_real$predicted_EAAR,PREDO_cord_pred_exp_real$real_EAAR, alternative="greater")
# n = 144

plot_pred_real_epic <- ggscatter(PREDO_cord_pred_exp_real, x = "predicted_EAAR", y = "real_EAAR", 
          add = "reg.line", conf.int = TRUE, 
          #cor.coef = TRUE, cor.method = "pearson",
          xlab = "predicted EAAR", ylab = "true EAAR", subtitle="PREDO EPIC (n=144)")+
   stat_cor(label.x = -0.4, label.y=3,p.accuracy = 0.001, r.accuracy = 0.01, alternative="greater")+
  theme(axis.text.x = element_text(size=9), axis.text.y=element_text(size=9), axis.title.y = element_text(size=12), axis.title.x=element_text(size=12),
  panel.grid.major = element_blank(),
  panel.grid.minor = element_blank()) +
  scale_y_continuous(limits = c(-3,3), breaks = seq(-3,3, by=1))+
  scale_x_continuous(limits = c(-0.4,0.6), breaks = seq(-0.4,0.6, by=0.2))

r(142) = .24, p=0.002 n=144

cor 450K

cor.test(PREDO_cord_pred_exp_realK$predicted_EAAR,PREDO_cord_pred_exp_realK$real_EAAR, alternative="greater")

plot_pred_real_450k <- ggscatter(PREDO_cord_pred_exp_realK, x = "predicted_EAAR", y = "real_EAAR", 
          add = "reg.line", conf.int = TRUE, 
          #cor.coef = TRUE, cor.method = "pearson",
          xlab = "predicted EAAR", ylab = "true EAAR", subtitle="PREDO 450K (n=766)")+
   stat_cor(label.x = -0.4, label.y=4, p.accuracy = 0.001, r.accuracy = 0.01, alternative="greater")+
  theme(axis.text.x = element_text(size=9), axis.text.y=element_text(size=9), axis.title.y = element_text(size=12), axis.title.x=element_text(size=12),
  panel.grid.major = element_blank(),
  panel.grid.minor = element_blank()) +
  scale_y_continuous(limits = c(-4.5,4), breaks = seq(-4,4, by=1))+
  scale_x_continuous(limits = c(-0.5,0.8), breaks = seq(-0.4,0.8, by=0.2))
# n = 796

r(764) = .11, p=0.002 n=766

ggarrange(plot_pred_real_epic, plot_pred_real_450k, nrow=1)
png(file="Results/Figures/predPREDO/predictionEAARcord.png", width= 3600, height=2100, res=480)
ggarrange(plot_pred_real_epic, plot_pred_real_450k, nrow=1)
dev.off()

pdf(file="Results/Figures/predPREDO/predictionEAARcord.pdf", width= 10, height=5)
ggarrange(plot_pred_real_epic, plot_pred_real_450k, nrow=1)
dev.off()

elastic net PREDO EPIC Cord blood

main model, without alcohol

```r
load(\InputData/ClockCalculationsInput/Reg_Input_Data_Cordblood_PREDO_EAAR_noNa_n.Rdata\)

<!-- rnb-source-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->




<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxueXJjX21hdF9QUkVET19Db3JkX24gPC0gbWF0cml4KFJlZ19JbnB1dF9EYXRhX0NvcmRibG9vZF9QUkVET19FQUFSX25vTmFfbiRFQUFSX0JvaGxpbilcbnhyY19tYXRfUFJFRE9fQ29yZF9uIDwtIG1vZGVsLm1hdHJpeCggfiAuIC0gRUFBUl9Cb2hsaW4sIGRhdGEgPSBSZWdfSW5wdXRfRGF0YV9Db3JkYmxvb2RfUFJFRE9fRUFBUl9ub05hX24pWywgLTFdXG55cmNfbWF0X1BSRURPX3NjYWxlZF9Db3JkX24gPC0gc2NhbGUoeXJjX21hdF9QUkVET19Db3JkX24pXG54cmNfbWF0X1BSRURPX3NjYWxlZF9Db3JkX24gPC0gc2NhbGUoeHJjX21hdF9QUkVET19Db3JkX24pXG5gYGBcbmBgYCJ9 -->

```r
```r
yrc_mat_PREDO_Cord_n <- matrix(Reg_Input_Data_Cordblood_PREDO_EAAR_noNa_n$EAAR_Bohlin)
xrc_mat_PREDO_Cord_n <- model.matrix( ~ . - EAAR_Bohlin, data = Reg_Input_Data_Cordblood_PREDO_EAAR_noNa_n)[, -1]
yrc_mat_PREDO_scaled_Cord_n <- scale(yrc_mat_PREDO_Cord_n)
xrc_mat_PREDO_scaled_Cord_n <- scale(xrc_mat_PREDO_Cord_n)

<!-- rnb-source-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->


<!-- set seed -->
<!-- ```{r} -->
<!-- set.seed(2020) -->
<!-- ``` -->


<!-- ```{r, warning=F} -->
<!--   nboot = 1000 -->

<!--   start_time <- Sys.time() -->
<!--   bootstraps_Cord_PREDO_n <- replicate(nboot, { -->
<!--     rws <- sample(1:nrow(xrc_mat_PREDO_scaled_Cord_n), replace = TRUE) -->
<!--     ensr(xrc_mat_PREDO_scaled_Cord_n[rws, ], yrc_mat_PREDO_scaled_Cord_n[rws, ], standardized = FALSE, family="gaussian", nlambda=100, nfolds=10, alpha=c(0.0,0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1.0)) -->
<!--   }, -->
<!--   simplify = FALSE) -->

<!--   end_time <- Sys.time() -->
<!--   end_time - start_time -->

<!-- ``` -->

<!-- ```{r} -->
<!-- save(bootstraps_Cord_PREDO_n, file="InputData/Data_ElasticNets/bootstraps_Cord_PREDO_n_1000.Rdata") -->
<!-- ``` -->



<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxubG9hZChcXElucHV0RGF0YS9EYXRhX0VsYXN0aWNOZXRzL2Jvb3RzdHJhcHNfQ29yZF9QUkVET19uXzEwMDAuUmRhdGFcXClcbmBgYFxuYGBgIn0= -->

```r
```r
load(\InputData/Data_ElasticNets/bootstraps_Cord_PREDO_n_1000.Rdata\)

<!-- rnb-source-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->


first get a summary of all ensr objects

<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuc3VtbWFyaWVzX0NvcmRfUFJFRE9fbiA8LVxuICBib290c3RyYXBzX0NvcmRfUFJFRE9fbiAlPiVcbiAgbGFwcGx5KHN1bW1hcnkpICU+JVxuICByYmluZGxpc3QoaWRjb2wgPSBcImJvb3RzdHJhcFwiKVxuXG5zdW1tYXJpZXNfQ29yZF9QUkVET19uXG5gYGAifQ== -->

```r
summaries_Cord_PREDO_n <-
  bootstraps_Cord_PREDO_n %>%
  lapply(summary) %>%
  rbindlist(idcol = "bootstrap")

summaries_Cord_PREDO_n
summaries_Cord_PREDO_n[, .SD[cvm == min(cvm)], by = c("bootstrap", "nzero")] %>%
  ggplot2::ggplot(data = .) +
  ggplot2::aes(x = nzero, y = cvm, group = bootstrap) +
  ggplot2::geom_point() +
  ggplot2::geom_line()+
  ggplot2::labs(x="\nnzero", y="cvm\n")+
  ggplot2::theme(text = element_text(size = 15), axis.title.x= element_text(size=15), axis.title.y= element_text(size=15))+
  ggplot2::theme_bw()
  
png(filename="Results/Figures/elasticNet_singleTissues/Outcome_main/bootstraps_Cord_PREDO.png", width=2200, height=1400, res=300)
summaries_Cord_PREDO_n[, .SD[cvm == min(cvm)], by = c("bootstrap", "nzero")] %>%
  ggplot2::ggplot(data = .) +
  ggplot2::aes(x = nzero, y = cvm, group = bootstrap) +
  ggplot2::geom_point() +
  ggplot2::geom_line()+
  ggplot2::labs(x="\nnzero", y="cvm\n")+
  ggplot2::theme(text = element_text(size = 15), axis.title.x= element_text(size=15), axis.title.y= element_text(size=15))+
  ggplot2::theme_bw()
dev.off()
```r
load(\InputData/Data_ElasticNets/pm2_Cord_PREDO_n.Rdata\)
# coefficient values for the models with smallest cvm by number of non-erzo coefficients and bootstrap

<!-- rnb-source-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->


look how often a particular variable is associated with a non-zero coefficient in a model with a given number of non-zero coefficients (over all bootstraps)


<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuY3N1bW1hcnlfQ29yZF9QUkVET19uIDwtIFJlZHVjZShmdW5jdGlvbih4LHkpIG1lcmdlKHggPSB4LCB5ID0geSwgYnkgPSBcIm56ZXJvXCIpLCBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0KHBtMl9Db3JkX1BSRURPX25bLCBsYXBwbHkoLlNELCBmdW5jdGlvbih4KSB7bWVhbih4ICE9IDApfSksIC5TRGNvbHMgPSBjKFwiQ2hpbGRfU2V4ZmVtYWxlXCIsIFwiQmlydGhfV2VpZ2h0XCIsIFwiQmlydGhfTGVuZ3RoXCIsIFwiSGVhZF9DaXJjdW1mZXJlbmNlX2F0X0JpcnRoXCIsIFwiRGVsaXZlcnlfTW9kZV9kaWNob3RvbWFpZGVkXCIsIFwiaW5kdWNlZGxhYm91clllc1wiLCBcIlBhcml0eV9kaWNob3RvbWdpdmVuIGJpcnRoIGJlZm9yZVwiLCBcIk1hdGVybmFsX0FnZV8xOFBvcFJlZ2FuZEJSXCIsIFwiTWF0ZXJuYWxfUHJlcHJlZ25hbmN5Qk1JMThvY3QyOG5ld1wiLCBcIm1hdGVybmFsX2h5cGVydGVuc2lvbl9kaWNob3RvbWh5cGVydGVuc2lvbiBpbiBjdXJyZW50IHByZWduYW5jeVwiLCBcIm1hdGVybmFsX2RpYWJldGVzX2RpY2hvdG9tZGlhYmV0ZXMgaW4gY3VycmVudCBwcmVnbmFuY3lcIiwgXCJNYXRlcm5hbF9NZW50YWxfRGlzb3JkZXJzX0J5X0NoaWxkYmlydGhZZXNcIiwgXCJzbW9raW5nX2RpY2hvdG9teWVzXCIpLCBieSA9IG56ZXJvXVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG0yX0NvcmRfUFJFRE9fblssIC4obWVhbl9jdm0gPSBtZWFuKGN2bSkpLCBieSA9IG56ZXJvXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBtMl9Db3JkX1BSRURPX25bLCAuKG1lZGlhbl9jdm0gPSBtZWRpYW4oY3ZtKSksIGJ5ID0gbnplcm9dXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSlbb3JkZXIobnplcm8pXVxuXG5jc3VtbWFyeV9Db3JkX1BSRURPX25cbmBgYCJ9 -->

```r
csummary_Cord_PREDO_n <- Reduce(function(x,y) merge(x = x, y = y, by = "nzero"), 
                               list(pm2_Cord_PREDO_n[, lapply(.SD, function(x) {mean(x != 0)}), .SDcols = c("Child_Sexfemale", "Birth_Weight", "Birth_Length", "Head_Circumference_at_Birth", "Delivery_Mode_dichotomaided", "inducedlabourYes", "Parity_dichotomgiven birth before", "Maternal_Age_18PopRegandBR", "Maternal_PrepregnancyBMI18oct28new", "maternal_hypertension_dichotomhypertension in current pregnancy", "maternal_diabetes_dichotomdiabetes in current pregnancy", "Maternal_Mental_Disorders_By_ChildbirthYes", "smoking_dichotomyes"), by = nzero]
                                    ,
                                    pm2_Cord_PREDO_n[, .(mean_cvm = mean(cvm)), by = nzero],
                                    pm2_Cord_PREDO_n[, .(median_cvm = median(cvm)), by = nzero]
                               ))[order(nzero)]

csummary_Cord_PREDO_n
g1_Cord_PREDO_n <-
  csummary_Cord_PREDO_n %>%
  melt(id.vars = c("nzero", "mean_cvm", "median_cvm")) %>%
  ggplot2::ggplot(.) +
  ggplot2::theme_bw() +
  ggplot2::aes(x = nzero) +
  ggplot2::geom_point(mapping = ggplot2::aes(y = variable, size = value, alpha = value, color = value*100)) +
  ggplot2::scale_color_gradient2(high = 'green', mid = "purple", low = "black", midpoint =50)+
  ggplot2::scale_alpha(guide = 'none')+
  ggplot2::scale_size(guide = 'none')+
  ggplot2::scale_y_discrete(labels= c("child sex", "birth weight", "birth length", "head circumference", "delivery mode", "induced labor", "parity", "maternal age", "maternal BMI", "maternal hypertension", "maternal diabetes", "maternal mental disorders", "maternal smoking"))+
  ggplot2::scale_x_continuous(breaks=0:14, labels=)+
  ggplot2::labs(y="predictor\n", x = "\nnumber of non-zero coefficients", color="%")+
  ggplot2::theme(text = element_text(size = 15), axis.title.x= element_text(size=15), axis.title.y= element_text(size=15))
  

g2_Cord_PREDO_n <-
  csummary_Cord_PREDO_n %>%
  ggplot2::ggplot(.) +
  ggplot2::theme_bw() +
  ggplot2::aes(x = nzero, y = median_cvm) +
  ggplot2::geom_point() + ggplot2::geom_line()+
  ggplot2::labs(y="median cvm", x = "nzero")+
  ggplot2::scale_x_continuous(breaks=0:14, labels=)+
  ggplot2::theme(axis.text=element_text(size=15),axis.title=element_text(size=18))

gridExtra::grid.arrange(g1_Cord_PREDO_n, g2_Cord_PREDO_n, ncol = 1)
g1_Cord_PREDO_n
png(filename="Results/Figures/elasticNet_singleTissues/Outcome_main/Model_Cord_PREDO.png", width=2800, height=1400, res=400)
g1_Cord_PREDO_n
dev.off()
png(filename="Results/Figures/elasticNet_singleTissues/Outcome_main/bootstrapModels_Cord_PREDO.png", width=2800, height=1400, res=300)
gridExtra::grid.arrange(g1_Cord_PREDO_n, g2_Cord_PREDO_n, ncol = 1)
dev.off()
elbow_finder(csummary_Cord_PREDO_n$nzero, csummary_Cord_PREDO_n$median_cvm)

nzero_indices_Cord <- data.frame(t(elbow_finder(csummary_Cord_PREDO_n$nzero, csummary_Cord_PREDO_n$median_cvm)))
colnames(nzero_indices_Cord) <- c("x", "y")
rownames(nzero_indices_Cord) <- NULL
```r
nzero_final_cord_predo <- 7

<!-- rnb-source-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->



<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuY3N1bW1hcnlfQ29yZF9QUkVET19uW256ZXJvICVpbiUgbnplcm9fZmluYWxfY29yZF9wcmVkb11cbmBgYCJ9 -->

```r
csummary_Cord_PREDO_n[nzero %in% nzero_final_cord_predo]
```r
summary_Cord_PREDO_n_finalnzero <- csummary_Cord_PREDO_n[nzero %in% nzero_final_cord_predo]
sig_var_names_Cord_PREDO_n_finalnzero <- Filter(function(x) any(x > 0.75), summary_Cord_PREDO_n_finalnzero[,!c(\nzero\, \mean_cvm\, \median_cvm\)]) %>% colnames()
colnames(summary_Cord_PREDO_n_finalnzero) <- c(\non-zero\, \child sex (female)\, \birth weight\, \birth length\, \head circumference\, \delivery mode (aided)\, \induced labor (yes)\, \parity (birth before)\, \maternal age\, \maternal BMI\, \maternal hypertension (yes)\, \maternal diabetes (yes)\, \maternal mental disorders (yes)\, \maternal smoking (yes)\, \mean cvm\, \median cvm\)
summary_Cord_PREDO_n_finalnzeroT <- as.data.frame(t(summary_Cord_PREDO_n_finalnzero[,-c(\non-zero\, \median cvm\, \mean cvm\)]))
summary_Cord_PREDO_n_finalnzeroT$variable <- rownames(summary_Cord_PREDO_n_finalnzeroT)
rownames(summary_Cord_PREDO_n_finalnzeroT) <- NULL
names(summary_Cord_PREDO_n_finalnzeroT)[names(summary_Cord_PREDO_n_finalnzeroT) == 'V1'] <- 'percent'
summary_Cord_PREDO_n_finalnzeroT <- summary_Cord_PREDO_n_finalnzeroT[order(summary_Cord_PREDO_n_finalnzeroT$percent),]

summary_Cord_PREDO_n_finalnzeroT$number <- seq(1, length(summary_Cord_PREDO_n_finalnzeroT$variable))

<!-- rnb-source-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->



<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxucGVyY192YXJzX0NvcmRfUFJFRE9fbiA8LSBcbiAgZ2dwbG90KHN1bW1hcnlfQ29yZF9QUkVET19uX2ZpbmFsbnplcm9ULCBhZXMocmVvcmRlcih2YXJpYWJsZSwgcGVyY2VudCksIHBlcmNlbnQsIGdyb3VwPTEpKStcbiAgZ2VvbV9wb2ludCgpKyBnZW9tX2xpbmUoKStcbiAgeWxhYihcIlxcbiUgb2NjdXJlbmNlIGluIG1vZGVscyB3aXRoIG56ZXJvIGNvZWZmaWNpZW50cyA9IDkgICAgXCIpK1xuICBzY2FsZV95X2NvbnRpbnVvdXMoYnJlYWtzPWMoMC4xLDAuMiwwLjMsMC40LDAuNSwwLjYsMC43LDAuOCwwLjkpKStcbiAgeGxhYihcInByZWRpY3RvclxcblwiKStcbiAgY29vcmRfZmxpcCgpK1xuICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQ9MC43NSwgbGluZXR5cGU9XCJkb3R0ZWRcIikrXG4gIHRoZW1lX2J3KCkrXG4gIHRoZW1lKHRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE1KSwgYXhpcy50aXRsZS54PSBlbGVtZW50X3RleHQoc2l6ZT0xNSksIGF4aXMudGl0bGUueT0gZWxlbWVudF90ZXh0KHNpemU9MTUpKVxuXG5wZXJjX3ZhcnNfQ29yZF9QUkVET19uXG5cbiMgZGVjaWRlIGZvciBjdXQtb2ZmICUgLT4gaGVyZSAuNzVcblxuRmlsdGVyKGZ1bmN0aW9uKHgpIGFueSh4ID4gMC43NSksIHN1bW1hcnlfQ29yZF9QUkVET19uX2ZpbmFsbnplcm9bLCFjKFwibm9uLXplcm9cIiwgXCJtZWFuIGN2bVwiLCBcIm1lZGlhbiBjdm1cIildKVxuXG5gYGAifQ== -->

```r
perc_vars_Cord_PREDO_n <- 
  ggplot(summary_Cord_PREDO_n_finalnzeroT, aes(reorder(variable, percent), percent, group=1))+
  geom_point()+ geom_line()+
  ylab("\n% occurence in models with nzero coefficients = 9    ")+
  scale_y_continuous(breaks=c(0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9))+
  xlab("predictor\n")+
  coord_flip()+
  geom_hline(yintercept=0.75, linetype="dotted")+
  theme_bw()+
  theme(text = element_text(size = 15), axis.title.x= element_text(size=15), axis.title.y= element_text(size=15))

perc_vars_Cord_PREDO_n

# decide for cut-off % -> here .75

Filter(function(x) any(x > 0.75), summary_Cord_PREDO_n_finalnzero[,!c("non-zero", "mean cvm", "median cvm")])
```r
pm2_Cord_PREDO_n_coef <-
  dcast(pm2_Cord_PREDO_n[,
                                as.list(unlist(
                                  lapply(.SD,
                                         function(x) {
                                           y <- unname(quantile(x[x != 0], probs = c(0.025, 0.975)))
                                           list(\non_zero\ = 100 * mean(x != 0),
                                                lcl = y[1],
                                                ucl = y[2],
                                                width = diff(y),
                                                median = median(x[x!= 0]))
                                         }))),
                                .SDcols = c(\Child_Sexfemale\, \Birth_Weight\, \Birth_Length\, \Head_Circumference_at_Birth\, \Delivery_Mode_dichotomaided\, \inducedlabourYes\, \Parity_dichotomgiven birth before\, \Maternal_Age_18PopRegandBR\, \Maternal_PrepregnancyBMI18oct28new\, \maternal_hypertension_dichotomhypertension in current pregnancy\, \maternal_diabetes_dichotomdiabetes in current pregnancy\, \Maternal_Mental_Disorders_By_ChildbirthYes\, \smoking_dichotomyes\),
                                by = nzero][order(nzero)] %>%
          melt(id.var = \nzero\) %>%
          .[, metric := sub(\^.+\\.(.+)$\, \\\1\, variable)] %>%
          .[, variable := sub(\^(.+)\\..+$\, \\\1\, variable)] %>%
          .[nzero ==nzero_final_cord_predo], nzero+ variable ~ metric, value.var=\value\)

# get desired order of predictors
pm2_Cord_PREDO_n_coef <-
  pm2_Cord_PREDO_n_coef[match(c(\Child_Sexfemale\, \Birth_Weight\, \Birth_Length\, \Head_Circumference_at_Birth\, \Delivery_Mode_dichotomaided\, \inducedlabourYes\, \Parity_dichotomgiven birth before\, \Maternal_Age_18PopRegandBR\, \Maternal_PrepregnancyBMI18oct28new\, \maternal_hypertension_dichotomhypertension in current pregnancy\, \maternal_diabetes_dichotomdiabetes in current pregnancy\, \Maternal_Mental_Disorders_By_ChildbirthYes\, \smoking_dichotomyes\), pm2_Cord_PREDO_n_coef$variable),]
pm2_Cord_PREDO_n_coef$variable <- factor(pm2_Cord_PREDO_n_coef$variabl, levels=unique(pm2_Cord_PREDO_n_coef$variable))

<!-- rnb-source-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->



<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxud3JpdGVfeGxzeChwbTJfQ29yZF9QUkVET19uX2NvZWYsXFxSZXN1bHRzL1RhYmxlcy9Db2VmZmljaWVudHNfQ29yZF9QUkVETy54bHN4XFwpXG5gYGBcbmBgYCJ9 -->

```r
```r
write_xlsx(pm2_Cord_PREDO_n_coef,\Results/Tables/Coefficients_Cord_PREDO.xlsx\)

<!-- rnb-source-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->



<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuY29lZl9Db3JkX1BSRURPX24gPC0gXG4gIGdncGxvdChwbTJfQ29yZF9QUkVET19uX2NvZWYsIGFlcyh5ID0gdmFyaWFibGUsIHg9bWVkaWFuKSkrXG4gIGdlb21fcG9pbnQobWFwcGluZyA9IGdncGxvdDI6OmFlcyh5ID0gdmFyaWFibGUsIHNpemUgPW5vbl96ZXJvLCBhbHBoYSA9IG5vbl96ZXJvLCBjb2xvciA9IG5vbl96ZXJvKSkrXG4gIHNjYWxlX2NvbG9yX2dyYWRpZW50MihoaWdoID0gJ2dyZWVuJywgbWlkID0gXCJwdXJwbGVcIiwgbG93ID0gXCJibGFja1wiLCBtaWRwb2ludCA9NTAsIGxpbWl0cz1jKDAsMTAwKSkrXG4gIHNjYWxlX2FscGhhKGd1aWRlID0gJ25vbmUnKStcbiAgc2NhbGVfc2l6ZShndWlkZSA9ICdub25lJykrXG4gIGdlb21fcG9pbnQoKStcbiAgZ2VvbV9lcnJvcmJhcihhZXMoeSA9IHZhcmlhYmxlLCB4bWluID0gbGNsLCB4bWF4ID0gdWNsKSwgd2lkdGggPSAwLjIpK1xuICBsYWJzKHk9XCJwcmVkaWN0b3JcIiwgeCA9IFwiXFxubWVkaWFuICYgOTUlIENJIG9mIGNvZWZmaWNpZW50IChvdmVyIGJvb3RzdHJhcHMpXCIsIGNvbG9yPVwiJVwiKStcbiAgc2NhbGVfeF9jb250aW51b3VzKGxpbWl0cz1jKC0wLjQsMC40KSwgYnJlYWtzPWMoLS40LC0uMywtLjIsIC0uMSwgMCwgLjEsIC4yLCAuMywgLjQpKStcbiAgc2NhbGVfeV9kaXNjcmV0ZShsYWJlbHM9IGMoXCJjaGlsZCBzZXggKGZlbWFsZSlcIiwgXCJiaXJ0aCB3ZWlnaHRcIiwgXCJiaXJ0aCBsZW5ndGhcIiwgXCJoZWFkIGNpcmN1bWZlcmVuY2VcIiwgXCJkZWxpdmVyeSBtb2RlIChhaWRlZClcIiwgXCJpbmR1Y2VkIGxhYm9yICh5ZXMpXCIsIFwicGFyaXR5IChiaXJ0aCBiZWZvcmUpXCIsIFwibWF0ZXJuYWwgYWdlXCIsIFwibWF0ZXJuYWwgQk1JXCIsIFwibWF0ZXJuYWwgaHlwZXJ0ZW5zaW9uICh5ZXMpXCIsIFwibWF0ZXJuYWwgZGlhYmV0ZXMgKHllcylcIiwgXCJtYXRlcm5hbCBtZW50YWwgZGlzb3JkZXJzICh5ZXMpXCIsIFwibWF0ZXJuYWwgc21va2luZyAoeWVzKVwiKSkrXG4gIGdlb21fdmxpbmUoeGludGVyY2VwdD0wLCBsaW5ldHlwZT1cImRhc2hlZFwiKStcbiAgdGhlbWVfYncoKStcbiAgdGhlbWUodGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTUpLCBheGlzLnRpdGxlLng9IGVsZW1lbnRfdGV4dChzaXplPTE1KSwgYXhpcy50aXRsZS55PSBlbGVtZW50X3RleHQoc2l6ZT0xNSkpXG5cblxuY29lZl9Db3JkX1BSRURPX25cbmBgYCJ9 -->

```r
coef_Cord_PREDO_n <- 
  ggplot(pm2_Cord_PREDO_n_coef, aes(y = variable, x=median))+
  geom_point(mapping = ggplot2::aes(y = variable, size =non_zero, alpha = non_zero, color = non_zero))+
  scale_color_gradient2(high = 'green', mid = "purple", low = "black", midpoint =50, limits=c(0,100))+
  scale_alpha(guide = 'none')+
  scale_size(guide = 'none')+
  geom_point()+
  geom_errorbar(aes(y = variable, xmin = lcl, xmax = ucl), width = 0.2)+
  labs(y="predictor", x = "\nmedian & 95% CI of coefficient (over bootstraps)", color="%")+
  scale_x_continuous(limits=c(-0.4,0.4), breaks=c(-.4,-.3,-.2, -.1, 0, .1, .2, .3, .4))+
  scale_y_discrete(labels= c("child sex (female)", "birth weight", "birth length", "head circumference", "delivery mode (aided)", "induced labor (yes)", "parity (birth before)", "maternal age", "maternal BMI", "maternal hypertension (yes)", "maternal diabetes (yes)", "maternal mental disorders (yes)", "maternal smoking (yes)"))+
  geom_vline(xintercept=0, linetype="dashed")+
  theme_bw()+
  theme(text = element_text(size = 15), axis.title.x= element_text(size=15), axis.title.y= element_text(size=15))


coef_Cord_PREDO_n
png(filename="Results/Figures/elasticNet_singleTissues/Outcome_main/coef_Cord_PREDO.png",  width=2800, height=1400, res=400)
coef_Cord_PREDO_n
dev.off()
p1 <-
  csummary_Cord_PREDO_n %>%
  melt(id.vars = c("nzero", "mean_cvm", "median_cvm")) %>%
  ggplot2::ggplot(.) +
  ggplot2::theme_bw() +
  ggplot2::aes(x = nzero) +
  ggplot2::geom_point(mapping = ggplot2::aes(y = variable, size = value, alpha = value, color = value*100)) +
  ggplot2::scale_color_gradient2(high = 'green', mid = "purple", low = "black", midpoint =50)+
  ggplot2::scale_alpha(guide = 'none')+
  ggplot2::scale_size(guide = 'none')+
  ggplot2::scale_y_discrete(labels= c("child sex (female)", "birth weight", "birth length", "head circumference", "delivery mode (aided)", "induced labor (yes)", "parity (birth before)", "maternal age", "maternal BMI", "maternal hypertension (yes)", "maternal diabetes (yes)", "maternal mental disorders (yes)", "maternal smoking (yes)"))+
  ggplot2::scale_x_continuous(breaks=0:14, labels=)+
  ggplot2::labs(y="predictor\n", x = "\nnumber of non-zero coefficients", color="%")+
  ggplot2::theme(text = element_text(size = 17), axis.title.x= element_text(size=15), axis.title.y= element_text(size=15), legend.position = "none")
  
p2 <- 
  ggplot(pm2_Cord_PREDO_n_coef, aes(y = variable, x=median))+
  geom_point(mapping = ggplot2::aes(y = variable, size =non_zero, alpha = non_zero, color = non_zero))+
  scale_color_gradient2(high = 'green', mid = "purple", low = "black", midpoint =50, limits=c(0,100))+
  scale_alpha(guide = 'none')+
  scale_size(guide = 'none')+
  geom_point()+
  geom_errorbar(aes(y = variable, xmin = lcl, xmax = ucl), width = 0.2)+
  labs(y="", x = "\nmedian & 95% CI of coefficient (over bootstraps)", color="%")+
  scale_x_continuous(limits=c(-0.4,0.4), breaks=c(-.4,-.3,-.2, -.1, 0, .1, .2, .3, .4))+
  scale_y_discrete(labels= c("child sex (female)", "birth weight", "birth length", "head circumference", "delivery mode (aided)", "induced labor (yes)", "parity (birth before)", "maternal age", "maternal BMI", "maternal hypertension (yes)", "maternal diabetes (yes)", "maternal mental disorders (yes)", "maternal smoking (yes)"))+
  geom_vline(xintercept=0, linetype="dashed")+
   ggtitle("nzero = 7")+
  theme_bw()+
 theme(text = element_text(size = 17), axis.title.x= element_text(size=15), axis.title.y= element_text(size=15), plot.title = element_text(size=15), axis.text.y=element_blank())

g1 <- ggplotGrob(p1)
g2 <- ggplotGrob(p2)
g <- cbind(g1, g2, size = "last")
g$heights <- unit.pmax(g1$heights, g2$heights)

png(filename="Results/Figures/elasticNet_singleTissues/Outcome_main/Model_coef_Cord_PREDO.png", width=5800, height=1600, res=400)
grid.draw(g)
dev.off()

to the top

elastic net PREDO 450K Cord blood

main model, without alcohol

```r
load(\InputData/ClockCalculationsInput/Reg_Input_Data_Cordblood_PREDO450K_EAAR_noNa_n.Rdata\)

<!-- rnb-source-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->




<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxueXJjX21hdF9QUkVET19Db3JkNDUwX24gPC0gbWF0cml4KFJlZ19JbnB1dF9EYXRhX0NvcmRibG9vZF9QUkVETzQ1MEtfRUFBUl9ub05hX24kRUFBUl9Cb2hsaW4pXG54cmNfbWF0X1BSRURPX0NvcmQ0NTBfbiA8LSBtb2RlbC5tYXRyaXgoIH4gLiAtIEVBQVJfQm9obGluLCBkYXRhID0gUmVnX0lucHV0X0RhdGFfQ29yZGJsb29kX1BSRURPNDUwS19FQUFSX25vTmFfbilbLCAtMV1cbnlyY19tYXRfUFJFRE9fc2NhbGVkX0NvcmQ0NTBfbiA8LSBzY2FsZSh5cmNfbWF0X1BSRURPX0NvcmQ0NTBfbilcbnhyY19tYXRfUFJFRE9fc2NhbGVkX0NvcmQ0NTBfbiA8LSBzY2FsZSh4cmNfbWF0X1BSRURPX0NvcmQ0NTBfbilcbmBgYFxuYGBgIn0= -->

```r
```r
yrc_mat_PREDO_Cord450_n <- matrix(Reg_Input_Data_Cordblood_PREDO450K_EAAR_noNa_n$EAAR_Bohlin)
xrc_mat_PREDO_Cord450_n <- model.matrix( ~ . - EAAR_Bohlin, data = Reg_Input_Data_Cordblood_PREDO450K_EAAR_noNa_n)[, -1]
yrc_mat_PREDO_scaled_Cord450_n <- scale(yrc_mat_PREDO_Cord450_n)
xrc_mat_PREDO_scaled_Cord450_n <- scale(xrc_mat_PREDO_Cord450_n)

<!-- rnb-source-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->



<!-- set seed -->
<!-- ```{r} -->
<!-- set.seed(2020) -->
<!-- ``` -->


<!-- ```{r, warning=F} -->
<!--   nboot = 1000 -->

<!--   start_time <- Sys.time() -->
<!--   bootstraps_Cord450_PREDO_n <- replicate(nboot, { -->
<!--     rws <- sample(1:nrow(xrc_mat_PREDO_scaled_Cord450_n), replace = TRUE) -->
<!--     ensr(xrc_mat_PREDO_scaled_Cord450_n[rws, ], yrc_mat_PREDO_scaled_Cord450_n[rws, ], standardized = FALSE, family="gaussian", nlambda=100, nfolds=10, alpha=c(0.0,0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1.0)) -->
<!--   }, -->
<!--   simplify = FALSE) -->

<!--   end_time <- Sys.time() -->
<!--   end_time - start_time -->

<!-- ``` -->

<!-- ```{r} -->
<!-- save(bootstraps_Cord450_PREDO_n, file="InputData/Data_ElasticNets/bootstraps_Cord450_PREDO_n_1000.Rdata") -->
<!-- ``` -->



<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxubG9hZChcXElucHV0RGF0YS9EYXRhX0VsYXN0aWNOZXRzL2Jvb3RzdHJhcHNfQ29yZDQ1MF9QUkVET19uXzEwMDAuUmRhdGFcXClcbmBgYFxuYGBgIn0= -->

```r
```r
load(\InputData/Data_ElasticNets/bootstraps_Cord450_PREDO_n_1000.Rdata\)

<!-- rnb-source-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->



<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuc3VtbWFyaWVzX0NvcmQ0NTBfUFJFRE9fbiA8LVxuICBib290c3RyYXBzX0NvcmQ0NTBfUFJFRE9fbiAlPiVcbiAgbGFwcGx5KHN1bW1hcnkpICU+JVxuICByYmluZGxpc3QoaWRjb2wgPSBcImJvb3RzdHJhcFwiKVxuXG5zdW1tYXJpZXNfQ29yZDQ1MF9QUkVET19uXG5gYGAifQ== -->

```r
summaries_Cord450_PREDO_n <-
  bootstraps_Cord450_PREDO_n %>%
  lapply(summary) %>%
  rbindlist(idcol = "bootstrap")

summaries_Cord450_PREDO_n
summaries_Cord450_PREDO_n[, .SD[cvm == min(cvm)], by = c("bootstrap", "nzero")] %>%
  ggplot2::ggplot(data = .) +
  ggplot2::aes(x = nzero, y = cvm, group = bootstrap) +
  ggplot2::geom_point() +
  ggplot2::geom_line()+
  ggplot2::labs(x="\nnzero", y="cvm\n")+
  ggplot2::theme(text = element_text(size = 15), axis.title.x= element_text(size=15), axis.title.y= element_text(size=15))+
  ggplot2::theme_bw()
png(filename="Results/Figures/elasticNet_singleTissues/Outcome_main/bootstraps_Cord450.png", width=2200, height=1400, res=300)
summaries_Cord450_PREDO_n[, .SD[cvm == min(cvm)], by = c("bootstrap", "nzero")] %>%
  ggplot2::ggplot(data = .) +
  ggplot2::aes(x = nzero, y = cvm, group = bootstrap) +
  ggplot2::geom_point() +
  ggplot2::geom_line()+
  ggplot2::labs(x="\nnzero", y="cvm\n")+
  ggplot2::theme(text = element_text(size = 15), axis.title.x= element_text(size=15), axis.title.y= element_text(size=15))+
  ggplot2::theme_bw()
dev.off()
```r
load(\InputData/Data_ElasticNets/pm2_Cord450_PREDO_n.Rdata\)
# coefficient values for the models with smallest cvm by number of non-erzo coefficients and bootstrap

<!-- rnb-source-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->



<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuY3N1bW1hcnlfQ29yZDQ1MF9QUkVET19uIDwtIFJlZHVjZShmdW5jdGlvbih4LHkpIG1lcmdlKHggPSB4LCB5ID0geSwgYnkgPSBcIm56ZXJvXCIpLCBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0KHBtMl9Db3JkNDUwX1BSRURPX25bLCBsYXBwbHkoLlNELCBmdW5jdGlvbih4KSB7bWVhbih4ICE9IDApfSksIC5TRGNvbHMgPSBjKFwiQ2hpbGRfU2V4ZmVtYWxlXCIsIFwiQmlydGhfV2VpZ2h0XCIsIFwiQmlydGhfTGVuZ3RoXCIsIFwiSGVhZF9DaXJjdW1mZXJlbmNlX2F0X0JpcnRoXCIsIFwiRGVsaXZlcnlfTW9kZV9kaWNob3RvbWFpZGVkXCIsIFwiaW5kdWNlZGxhYm91clllc1wiLCBcIlBhcml0eV9kaWNob3RvbWdpdmVuIGJpcnRoIGJlZm9yZVwiLCBcIk1hdGVybmFsX0FnZV8xOFBvcFJlZ2FuZEJSXCIsIFwiTWF0ZXJuYWxfUHJlcHJlZ25hbmN5Qk1JMThvY3QyOG5ld1wiLCBcIm1hdGVybmFsX2h5cGVydGVuc2lvbl9kaWNob3RvbWh5cGVydGVuc2lvbiBpbiBjdXJyZW50IHByZWduYW5jeVwiLCBcIm1hdGVybmFsX2RpYWJldGVzX2RpY2hvdG9tZGlhYmV0ZXMgaW4gY3VycmVudCBwcmVnbmFuY3lcIiwgXCJNYXRlcm5hbF9NZW50YWxfRGlzb3JkZXJzX0J5X0NoaWxkYmlydGhZZXNcIiwgXCJzbW9raW5nX2RpY2hvdG9teWVzXCIpLCBieSA9IG56ZXJvXVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG0yX0NvcmQ0NTBfUFJFRE9fblssIC4obWVhbl9jdm0gPSBtZWFuKGN2bSkpLCBieSA9IG56ZXJvXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBtMl9Db3JkNDUwX1BSRURPX25bLCAuKG1lZGlhbl9jdm0gPSBtZWRpYW4oY3ZtKSksIGJ5ID0gbnplcm9dXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSlbb3JkZXIobnplcm8pXVxuXG5jc3VtbWFyeV9Db3JkNDUwX1BSRURPX25cbmBgYCJ9 -->

```r
csummary_Cord450_PREDO_n <- Reduce(function(x,y) merge(x = x, y = y, by = "nzero"), 
                               list(pm2_Cord450_PREDO_n[, lapply(.SD, function(x) {mean(x != 0)}), .SDcols = c("Child_Sexfemale", "Birth_Weight", "Birth_Length", "Head_Circumference_at_Birth", "Delivery_Mode_dichotomaided", "inducedlabourYes", "Parity_dichotomgiven birth before", "Maternal_Age_18PopRegandBR", "Maternal_PrepregnancyBMI18oct28new", "maternal_hypertension_dichotomhypertension in current pregnancy", "maternal_diabetes_dichotomdiabetes in current pregnancy", "Maternal_Mental_Disorders_By_ChildbirthYes", "smoking_dichotomyes"), by = nzero]
                                    ,
                                    pm2_Cord450_PREDO_n[, .(mean_cvm = mean(cvm)), by = nzero],
                                    pm2_Cord450_PREDO_n[, .(median_cvm = median(cvm)), by = nzero]
                               ))[order(nzero)]

csummary_Cord450_PREDO_n
g1_Cord450_PREDO_n <-
  csummary_Cord450_PREDO_n %>%
  melt(id.vars = c("nzero", "mean_cvm", "median_cvm")) %>%
  ggplot2::ggplot(.) +
  ggplot2::theme_bw() +
  ggplot2::aes(x = nzero) +
  ggplot2::geom_point(mapping = ggplot2::aes(y = variable, size = value, alpha = value, color = value*100)) +
  ggplot2::scale_color_gradient2(high = 'green', mid = "purple", low = "black", midpoint =50)+
  ggplot2::scale_alpha(guide = 'none')+
  ggplot2::scale_size(guide = 'none')+
  ggplot2::scale_y_discrete(labels= c("child sex", "birth weight", "birth length", "head circumference", "delivery mode", "induced labor", "parity", "maternal age", "maternal BMI", "maternal hypertension", "maternal diabetes", "maternal mental disorders", "maternal smoking"))+
  ggplot2::scale_x_continuous(breaks=0:14, labels=)+
  ggplot2::labs(y="predictor\n", x = "\nnumber of non-zero coefficients", color="%")+
  ggplot2::theme(text = element_text(size = 15), axis.title.x= element_text(size=15), axis.title.y= element_text(size=15))
  

g2_Cord450_PREDO_n <-
  csummary_Cord450_PREDO_n %>%
  ggplot2::ggplot(.) +
  ggplot2::theme_bw() +
  ggplot2::aes(x = nzero, y = median_cvm) +
  ggplot2::geom_point() + ggplot2::geom_line()+
  ggplot2::labs(y="median cvm", x = "nzero")+
  ggplot2::scale_x_continuous(breaks=0:14, labels=)+
  ggplot2::theme(axis.text=element_text(size=15),axis.title=element_text(size=18))

gridExtra::grid.arrange(g1_Cord450_PREDO_n, g2_Cord450_PREDO_n, ncol = 1)
g1_Cord450_PREDO_n
png(filename="Results/Figures/elasticNet_singleTissues/Outcome_main/Model_Cord450_PREDO.png", width=2800, height=1400, res=400)
g1_Cord450_PREDO_n
dev.off()
png(filename="Results/Figures/elasticNet_singleTissues/Outcome_main/bootstrapModels_Cord450_PREDO.png", width=2800, height=1400, res=300)
gridExtra::grid.arrange(g1_Cord450_PREDO_n, g2_Cord450_PREDO_n, ncol = 1)
dev.off()
elbow_finder(csummary_Cord450_PREDO_n$nzero, csummary_Cord450_PREDO_n$median_cvm)

nzero_indices_Cord450 <- data.frame(t(elbow_finder(csummary_Cord450_PREDO_n$nzero, csummary_Cord450_PREDO_n$median_cvm)))
colnames(nzero_indices_Cord450) <- c("x", "y")
rownames(nzero_indices_Cord450) <- NULL
```r
nzero_final_Cord450_predo <- 6

<!-- rnb-source-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->



<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuY3N1bW1hcnlfQ29yZDQ1MF9QUkVET19uW256ZXJvICVpbiUgbnplcm9fZmluYWxfQ29yZDQ1MF9wcmVkb11cbmBgYCJ9 -->

```r
csummary_Cord450_PREDO_n[nzero %in% nzero_final_Cord450_predo]
```r
summary_Cord450_PREDO_n_finalnzero <- csummary_Cord450_PREDO_n[nzero %in% nzero_final_Cord450_predo]
sig_var_names_Cord450_PREDO_n_finalnzero <- Filter(function(x) any(x > 0.75), summary_Cord450_PREDO_n_finalnzero[,!c(\nzero\, \mean_cvm\, \median_cvm\)]) %>% colnames()
colnames(summary_Cord450_PREDO_n_finalnzero) <- c(\non-zero\, \child sex (female)\, \birth weight\, \birth length\, \head circumference\, \delivery mode (aided)\, \induced labor (yes)\, \parity (birth before)\, \maternal age\, \maternal BMI\, \maternal hypertension (yes)\, \maternal diabetes (yes)\, \maternal mental disorders (yes)\, \maternal smoking (yes)\, \mean cvm\, \median cvm\)
summary_Cord450_PREDO_n_finalnzeroT <- as.data.frame(t(summary_Cord450_PREDO_n_finalnzero[,-c(\non-zero\, \median cvm\, \mean cvm\)]))
summary_Cord450_PREDO_n_finalnzeroT$variable <- rownames(summary_Cord450_PREDO_n_finalnzeroT)
rownames(summary_Cord450_PREDO_n_finalnzeroT) <- NULL
names(summary_Cord450_PREDO_n_finalnzeroT)[names(summary_Cord450_PREDO_n_finalnzeroT) == 'V1'] <- 'percent'
summary_Cord450_PREDO_n_finalnzeroT <- summary_Cord450_PREDO_n_finalnzeroT[order(summary_Cord450_PREDO_n_finalnzeroT$percent),]

summary_Cord450_PREDO_n_finalnzeroT$number <- seq(1, length(summary_Cord450_PREDO_n_finalnzeroT$variable))

<!-- rnb-source-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->



<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxucGVyY192YXJzX0NvcmQ0NTBfUFJFRE9fbiA8LSBcbiAgZ2dwbG90KHN1bW1hcnlfQ29yZDQ1MF9QUkVET19uX2ZpbmFsbnplcm9ULCBhZXMocmVvcmRlcih2YXJpYWJsZSwgcGVyY2VudCksIHBlcmNlbnQsIGdyb3VwPTEpKStcbiAgZ2VvbV9wb2ludCgpKyBnZW9tX2xpbmUoKStcbiAgeWxhYihcIlxcbiUgb2NjdXJlbmNlIGluIG1vZGVscyB3aXRoIG56ZXJvIGNvZWZmaWNpZW50cyA9IDkgICAgXCIpK1xuICBzY2FsZV95X2NvbnRpbnVvdXMoYnJlYWtzPWMoMC4xLDAuMiwwLjMsMC40LDAuNSwwLjYsMC43LDAuOCwwLjkpKStcbiAgeGxhYihcInByZWRpY3RvclxcblwiKStcbiAgY29vcmRfZmxpcCgpK1xuICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQ9MC43NSwgbGluZXR5cGU9XCJkb3R0ZWRcIikrXG4gIHRoZW1lX2J3KCkrXG4gIHRoZW1lKHRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE1KSwgYXhpcy50aXRsZS54PSBlbGVtZW50X3RleHQoc2l6ZT0xNSksIGF4aXMudGl0bGUueT0gZWxlbWVudF90ZXh0KHNpemU9MTUpKVxuXG5wZXJjX3ZhcnNfQ29yZDQ1MF9QUkVET19uXG5cbiMgZGVjaWRlIGZvciBjdXQtb2ZmICUgLT4gaGVyZSAuNzVcblxuRmlsdGVyKGZ1bmN0aW9uKHgpIGFueSh4ID4gMC43NSksIHN1bW1hcnlfQ29yZDQ1MF9QUkVET19uX2ZpbmFsbnplcm9bLCFjKFwibm9uLXplcm9cIiwgXCJtZWFuIGN2bVwiLCBcIm1lZGlhbiBjdm1cIildKVxuXG5gYGAifQ== -->

```r
perc_vars_Cord450_PREDO_n <- 
  ggplot(summary_Cord450_PREDO_n_finalnzeroT, aes(reorder(variable, percent), percent, group=1))+
  geom_point()+ geom_line()+
  ylab("\n% occurence in models with nzero coefficients = 9    ")+
  scale_y_continuous(breaks=c(0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9))+
  xlab("predictor\n")+
  coord_flip()+
  geom_hline(yintercept=0.75, linetype="dotted")+
  theme_bw()+
  theme(text = element_text(size = 15), axis.title.x= element_text(size=15), axis.title.y= element_text(size=15))

perc_vars_Cord450_PREDO_n

# decide for cut-off % -> here .75

Filter(function(x) any(x > 0.75), summary_Cord450_PREDO_n_finalnzero[,!c("non-zero", "mean cvm", "median cvm")])
```r
pm2_Cord450_PREDO_n_coef <-
  dcast(pm2_Cord450_PREDO_n[,
                                as.list(unlist(
                                  lapply(.SD,
                                         function(x) {
                                           y <- unname(quantile(x[x != 0], probs = c(0.025, 0.975)))
                                           list(\non_zero\ = 100 * mean(x != 0),
                                                lcl = y[1],
                                                ucl = y[2],
                                                width = diff(y),
                                                median = median(x[x!= 0]))
                                         }))),
                                .SDcols = c(\Child_Sexfemale\, \Birth_Weight\, \Birth_Length\, \Head_Circumference_at_Birth\, \Delivery_Mode_dichotomaided\, \inducedlabourYes\, \Parity_dichotomgiven birth before\, \Maternal_Age_18PopRegandBR\, \Maternal_PrepregnancyBMI18oct28new\, \maternal_hypertension_dichotomhypertension in current pregnancy\, \maternal_diabetes_dichotomdiabetes in current pregnancy\, \Maternal_Mental_Disorders_By_ChildbirthYes\, \smoking_dichotomyes\),
                                by = nzero][order(nzero)] %>%
          melt(id.var = \nzero\) %>%
          .[, metric := sub(\^.+\\.(.+)$\, \\\1\, variable)] %>%
          .[, variable := sub(\^(.+)\\..+$\, \\\1\, variable)] %>%
          .[nzero ==nzero_final_Cord450_predo], nzero+ variable ~ metric, value.var=\value\)

# get desired order of predictors
pm2_Cord450_PREDO_n_coef <-
  pm2_Cord450_PREDO_n_coef[match(c(\Child_Sexfemale\, \Birth_Weight\, \Birth_Length\, \Head_Circumference_at_Birth\, \Delivery_Mode_dichotomaided\, \inducedlabourYes\, \Parity_dichotomgiven birth before\, \Maternal_Age_18PopRegandBR\, \Maternal_PrepregnancyBMI18oct28new\, \maternal_hypertension_dichotomhypertension in current pregnancy\, \maternal_diabetes_dichotomdiabetes in current pregnancy\, \Maternal_Mental_Disorders_By_ChildbirthYes\, \smoking_dichotomyes\), pm2_Cord450_PREDO_n_coef$variable),]
pm2_Cord450_PREDO_n_coef$variable <- factor(pm2_Cord450_PREDO_n_coef$variabl, levels=unique(pm2_Cord450_PREDO_n_coef$variable))

<!-- rnb-source-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->



<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxud3JpdGVfeGxzeChwbTJfQ29yZDQ1MF9QUkVET19uX2NvZWYsXFxSZXN1bHRzL1RhYmxlcy9Db2VmZmljaWVudHNfQ29yZDQ1MF9QUkVETy54bHN4XFwpXG5gYGBcbmBgYCJ9 -->

```r
```r
write_xlsx(pm2_Cord450_PREDO_n_coef,\Results/Tables/Coefficients_Cord450_PREDO.xlsx\)

<!-- rnb-source-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->



<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuY29lZl9Db3JkNDUwX1BSRURPX24gPC0gXG4gIGdncGxvdChwbTJfQ29yZDQ1MF9QUkVET19uX2NvZWYsIGFlcyh5ID0gdmFyaWFibGUsIHg9bWVkaWFuKSkrXG4gIGdlb21fcG9pbnQobWFwcGluZyA9IGdncGxvdDI6OmFlcyh5ID0gdmFyaWFibGUsIHNpemUgPW5vbl96ZXJvLCBhbHBoYSA9IG5vbl96ZXJvLCBjb2xvciA9IG5vbl96ZXJvKSkrXG4gIHNjYWxlX2NvbG9yX2dyYWRpZW50MihoaWdoID0gJ2dyZWVuJywgbWlkID0gXCJwdXJwbGVcIiwgbG93ID0gXCJibGFja1wiLCBtaWRwb2ludCA9NTAsIGxpbWl0cz1jKDAsMTAwKSkrXG4gIHNjYWxlX2FscGhhKGd1aWRlID0gJ25vbmUnKStcbiAgc2NhbGVfc2l6ZShndWlkZSA9ICdub25lJykrXG4gIGdlb21fcG9pbnQoKStcbiAgZ2VvbV9lcnJvcmJhcihhZXMoeSA9IHZhcmlhYmxlLCB4bWluID0gbGNsLCB4bWF4ID0gdWNsKSwgd2lkdGggPSAwLjIpK1xuICBsYWJzKHk9XCJwcmVkaWN0b3JcIiwgeCA9IFwiXFxubWVkaWFuICYgOTUlIENJIG9mIGNvZWZmaWNpZW50IChvdmVyIGJvb3RzdHJhcHMpXCIsIGNvbG9yPVwiJVwiKStcbiAgc2NhbGVfeF9jb250aW51b3VzKGxpbWl0cz1jKC0wLjQsMC40KSwgYnJlYWtzPWMoLS40LC0uMywtLjIsIC0uMSwgMCwgLjEsIC4yLCAuMywgLjQpKStcbiAgc2NhbGVfeV9kaXNjcmV0ZShsYWJlbHM9IGMoXCJjaGlsZCBzZXggKGZlbWFsZSlcIiwgXCJiaXJ0aCB3ZWlnaHRcIiwgXCJiaXJ0aCBsZW5ndGhcIiwgXCJoZWFkIGNpcmN1bWZlcmVuY2VcIiwgXCJkZWxpdmVyeSBtb2RlIChhaWRlZClcIiwgXCJpbmR1Y2VkIGxhYm9yICh5ZXMpXCIsIFwicGFyaXR5IChiaXJ0aCBiZWZvcmUpXCIsIFwibWF0ZXJuYWwgYWdlXCIsIFwibWF0ZXJuYWwgQk1JXCIsIFwibWF0ZXJuYWwgaHlwZXJ0ZW5zaW9uICh5ZXMpXCIsIFwibWF0ZXJuYWwgZGlhYmV0ZXMgKHllcylcIiwgXCJtYXRlcm5hbCBtZW50YWwgZGlzb3JkZXJzICh5ZXMpXCIsIFwibWF0ZXJuYWwgc21va2luZyAoeWVzKVwiKSkrXG4gIGdlb21fdmxpbmUoeGludGVyY2VwdD0wLCBsaW5ldHlwZT1cImRhc2hlZFwiKStcbiAgdGhlbWVfYncoKStcbiAgdGhlbWUodGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTUpLCBheGlzLnRpdGxlLng9IGVsZW1lbnRfdGV4dChzaXplPTE1KSwgYXhpcy50aXRsZS55PSBlbGVtZW50X3RleHQoc2l6ZT0xNSkpXG5cblxuY29lZl9Db3JkNDUwX1BSRURPX25cbmBgYCJ9 -->

```r
coef_Cord450_PREDO_n <- 
  ggplot(pm2_Cord450_PREDO_n_coef, aes(y = variable, x=median))+
  geom_point(mapping = ggplot2::aes(y = variable, size =non_zero, alpha = non_zero, color = non_zero))+
  scale_color_gradient2(high = 'green', mid = "purple", low = "black", midpoint =50, limits=c(0,100))+
  scale_alpha(guide = 'none')+
  scale_size(guide = 'none')+
  geom_point()+
  geom_errorbar(aes(y = variable, xmin = lcl, xmax = ucl), width = 0.2)+
  labs(y="predictor", x = "\nmedian & 95% CI of coefficient (over bootstraps)", color="%")+
  scale_x_continuous(limits=c(-0.4,0.4), breaks=c(-.4,-.3,-.2, -.1, 0, .1, .2, .3, .4))+
  scale_y_discrete(labels= c("child sex (female)", "birth weight", "birth length", "head circumference", "delivery mode (aided)", "induced labor (yes)", "parity (birth before)", "maternal age", "maternal BMI", "maternal hypertension (yes)", "maternal diabetes (yes)", "maternal mental disorders (yes)", "maternal smoking (yes)"))+
  geom_vline(xintercept=0, linetype="dashed")+
  theme_bw()+
  theme(text = element_text(size = 15), axis.title.x= element_text(size=15), axis.title.y= element_text(size=15))


coef_Cord450_PREDO_n
png(filename="Results/Figures/elasticNet_singleTissues/Outcome_main/coef_Cord450_PREDO.png",  width=2800, height=1400, res=400)
coef_Cord450_PREDO_n
dev.off()
p1 <-
  csummary_Cord450_PREDO_n %>%
  melt(id.vars = c("nzero", "mean_cvm", "median_cvm")) %>%
  ggplot2::ggplot(.) +
  ggplot2::theme_bw() +
  ggplot2::aes(x = nzero) +
  ggplot2::geom_point(mapping = ggplot2::aes(y = variable, size = value, alpha = value, color = value*100)) +
  ggplot2::scale_color_gradient2(high = 'green', mid = "purple", low = "black", midpoint =50)+
  ggplot2::scale_alpha(guide = 'none')+
  ggplot2::scale_size(guide = 'none')+
  ggplot2::scale_y_discrete(labels= c("child sex (female)", "birth weight", "birth length", "head circumference", "delivery mode (aided)", "induced labor (yes)", "parity (birth before)", "maternal age", "maternal BMI", "maternal hypertension (yes)", "maternal diabetes (yes)", "maternal mental disorders (yes)", "maternal smoking (yes)"))+
  ggplot2::scale_x_continuous(breaks=0:14, labels=)+
  ggplot2::labs(y="predictor\n", x = "\nnumber of non-zero coefficients", color="%")+
  ggplot2::theme(text = element_text(size = 17), axis.title.x= element_text(size=15), axis.title.y= element_text(size=15), legend.position = "none")
  
p2 <- 
  ggplot(pm2_Cord450_PREDO_n_coef, aes(y = variable, x=median))+
  geom_point(mapping = ggplot2::aes(y = variable, size =non_zero, alpha = non_zero, color = non_zero))+
  scale_color_gradient2(high = 'green', mid = "purple", low = "black", midpoint =50, limits=c(0,100))+
  scale_alpha(guide = 'none')+
  scale_size(guide = 'none')+
  geom_point()+
  geom_errorbar(aes(y = variable, xmin = lcl, xmax = ucl), width = 0.2)+
  labs(y="", x = "\nmedian & 95% CI of coefficient (over bootstraps)", color="%")+
  scale_x_continuous(limits=c(-0.4,0.4), breaks=c(-.4,-.3,-.2, -.1, 0, .1, .2, .3, .4))+
  scale_y_discrete(labels= c("child sex (female)", "birth weight", "birth length", "head circumference", "delivery mode (aided)", "induced labor (yes)", "parity (birth before)", "maternal age", "maternal BMI", "maternal hypertension (yes)", "maternal diabetes (yes)", "maternal mental disorders (yes)", "maternal smoking (yes)"))+
  geom_vline(xintercept=0, linetype="dashed")+
   ggtitle("nzero = 6")+
  theme_bw()+
 theme(text = element_text(size = 17), axis.title.x= element_text(size=15), axis.title.y= element_text(size=15), plot.title = element_text(size=15), axis.text.y=element_blank())

g1 <- ggplotGrob(p1)
g2 <- ggplotGrob(p2)
g <- cbind(g1, g2, size = "last")
g$heights <- unit.pmax(g1$heights, g2$heights)

png(filename="Results/Figures/elasticNet_singleTissues/Outcome_main/Model_coef_Cord450_PREDO.png", width=5800, height=1600, res=400)
grid.draw(g)
dev.off()
```r
rm(list = setdiff(ls(), lsf.str()))

<!-- rnb-source-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->


[to the top](#top) 

# Cross-Tissues

## Correlations DNAmGA {#corTissuesDNAmGA}  

<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxubG9hZChmaWxlPSBcXElucHV0RGF0YS9DbG9ja0NhbGN1bGF0aW9uc0lucHV0L0RhdGFfQ1ZTX0lUVS5SZGF0YVxcKVxubG9hZChmaWxlPSBcXElucHV0RGF0YS9DbG9ja0NhbGN1bGF0aW9uc0lucHV0L0RhdGFfQ29yZF9JVFUuUmRhdGFcXClcbmxvYWQoZmlsZT0gXFxJbnB1dERhdGEvQ2xvY2tDYWxjdWxhdGlvbnNJbnB1dC9EYXRhX1BsYWNlbnRhX0lUVS5SZGF0YVxcKVxubG9hZChmaWxlPVxcSW5wdXREYXRhL0Nsb2NrQ2FsY3VsYXRpb25zSW5wdXQvRGF0YV9GdWxsX0lUVS5SZGF0YVxcKSAjIGRhdGEgcGVyc29ucyB3aXRoIGFsbCBtZWFzdXJlbWVudCBwb2ludHMgYXZhaWxhYmxlXG5sb2FkKGZpbGU9XFxJbnB1dERhdGEvQ2xvY2tDYWxjdWxhdGlvbnNJbnB1dC9EYXRhX0NvcmRfUGxhY2VudGFfSVRVLlJkYXRhXFwpXG5sb2FkKGZpbGU9XFxJbnB1dERhdGEvQ2xvY2tDYWxjdWxhdGlvbnNJbnB1dC9EYXRhX0NWU19QbGFjZW50YV9JVFUuUmRhdGFcXClcbmxvYWQoZmlsZT1cXElucHV0RGF0YS9DbG9ja0NhbGN1bGF0aW9uc0lucHV0L0RhdGFfQ1ZTX0NvcmRfSVRVLlJkYXRhXFwpXG5sb2FkKGZpbGU9XFxJbnB1dERhdGEvQ2xvY2tDYWxjdWxhdGlvbnNJbnB1dC9EYXRhX0lUVV9hbGwuUmRhdGFcXCkgIyBhbGwgcGVyc29ucyB0b2dldGhlciBpbiBvbmUgZGF0YSBmcmFtZVxuXG5sb2FkKGZpbGU9IFxcSW5wdXREYXRhL0Nsb2NrQ2FsY3VsYXRpb25zSW5wdXQvRGF0YV9QbGFjZW50YV9tYWxlX0lUVS5SZGF0YVxcKVxubG9hZChmaWxlPSBcXElucHV0RGF0YS9DbG9ja0NhbGN1bGF0aW9uc0lucHV0L0RhdGFfUGxhY2VudGFfZmVtYWxlX0lUVS5SZGF0YVxcKVxuXG5sb2FkKGZpbGU9XFxJbnB1dERhdGEvQ2xvY2tDYWxjdWxhdGlvbnNJbnB1dC9EYXRhX1BSRURPXzQ1MEtjb3JkLlJkYXRhXFwpXG5sb2FkKGZpbGU9XFxJbnB1dERhdGEvQ2xvY2tDYWxjdWxhdGlvbnNJbnB1dC9EYXRhX1BSRURPX0VQSUNjb3JkLlJkYXRhXFwpXG5sb2FkKGZpbGU9XFxJbnB1dERhdGEvQ2xvY2tDYWxjdWxhdGlvbnNJbnB1dC9EYXRhX1BSRURPX0VQSUNwbGFjZW50YS5SZGF0YVxcKVxubG9hZChmaWxlPVxcSW5wdXREYXRhL0Nsb2NrQ2FsY3VsYXRpb25zSW5wdXQvRGF0YV9QUkVET19FUElDX0NvcmRfUGxhY2VudGEuUmRhdGFcXClcbmxvYWQoZmlsZT1cXElucHV0RGF0YS9DbG9ja0NhbGN1bGF0aW9uc0lucHV0L0RhdGFfUFJFRE9fRVBJQ19hbGwuUmRhdGFcXCkgIyBhbGwgcGVyc29ucyB3aXRoIEVQSUMgZGF0YSB0b2dldGhlciBpbiBvbmUgZGF0YSBmcmFtZVxuXG5sb2FkKGZpbGU9XFxJbnB1dERhdGEvQ2xvY2tDYWxjdWxhdGlvbnNJbnB1dC9EYXRhX1BSRURPX1BsYWNlbnRhX21hbGUuUmRhdGFcXClcbmxvYWQoZmlsZT1cXElucHV0RGF0YS9DbG9ja0NhbGN1bGF0aW9uc0lucHV0L0RhdGFfUFJFRE9fUGxhY2VudGFfZmVtYWxlLlJkYXRhXFwpXG5gYGBcbmBgYCJ9 -->

```r
```r
load(file= \InputData/ClockCalculationsInput/Data_CVS_ITU.Rdata\)
load(file= \InputData/ClockCalculationsInput/Data_Cord_ITU.Rdata\)
load(file= \InputData/ClockCalculationsInput/Data_Placenta_ITU.Rdata\)
load(file=\InputData/ClockCalculationsInput/Data_Full_ITU.Rdata\) # data persons with all measurement points available
load(file=\InputData/ClockCalculationsInput/Data_Cord_Placenta_ITU.Rdata\)
load(file=\InputData/ClockCalculationsInput/Data_CVS_Placenta_ITU.Rdata\)
load(file=\InputData/ClockCalculationsInput/Data_CVS_Cord_ITU.Rdata\)
load(file=\InputData/ClockCalculationsInput/Data_ITU_all.Rdata\) # all persons together in one data frame

load(file= \InputData/ClockCalculationsInput/Data_Placenta_male_ITU.Rdata\)
load(file= \InputData/ClockCalculationsInput/Data_Placenta_female_ITU.Rdata\)

load(file=\InputData/ClockCalculationsInput/Data_PREDO_450Kcord.Rdata\)
load(file=\InputData/ClockCalculationsInput/Data_PREDO_EPICcord.Rdata\)
load(file=\InputData/ClockCalculationsInput/Data_PREDO_EPICplacenta.Rdata\)
load(file=\InputData/ClockCalculationsInput/Data_PREDO_EPIC_Cord_Placenta.Rdata\)
load(file=\InputData/ClockCalculationsInput/Data_PREDO_EPIC_all.Rdata\) # all persons with EPIC data together in one data frame

load(file=\InputData/ClockCalculationsInput/Data_PREDO_Placenta_male.Rdata\)
load(file=\InputData/ClockCalculationsInput/Data_PREDO_Placenta_female.Rdata\)

<!-- rnb-source-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->


*Cord blood & Placenta (in ITU)*

<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxuRE5BbUdBc19iaXJ0aCA8LSBEYXRhX0NvcmRfUGxhY2VudGFfSVRVWyAsYyhcXEROQW1HQV9Cb2hsaW5cXCxcXEROQW1HQV9MZWVcXCwgXFxHZXN0YXRpb25hbF9BZ2VfV2Vla3NcXCldXG5jb2xuYW1lcyhETkFtR0FzX2JpcnRoKSA8LSBjKFxcQ29yZGJsb29kXFwsIFxcUGxhY2VudGFcXCwgXFxHQV9iaXJ0aFxcKVxuYGBgXG5gYGAifQ== -->

```r
```r
DNAmGAs_birth <- Data_Cord_Placenta_ITU[ ,c(\DNAmGA_Bohlin\,\DNAmGA_Lee\, \Gestational_Age_Weeks\)]
colnames(DNAmGAs_birth) <- c(\Cordblood\, \Placenta\, \GA_birth\)

<!-- rnb-source-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->



<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuQmlydGhjb3JyRE5BbUdBcyA8LSByY29ycihhcy5tYXRyaXgoRE5BbUdBc19iaXJ0aCkpXG5CaXJ0aGNvcnJETkFtR0FzXG5gYGAifQ== -->

```r
BirthcorrDNAmGAs <- rcorr(as.matrix(DNAmGAs_birth))
BirthcorrDNAmGAs

adjusting for GA at birth

# partial correlation
pcor.test(x=DNAmGAs_birth$Cordblood, y=DNAmGAs_birth$Placenta, z=DNAmGAs_birth$GA_birth)
```r
cor_cord_placenta_dnamga <-ggscatter(Data_Cord_Placenta_ITU, x = \DNAmGA_Bohlin\, y = \DNAmGA_Lee\, 
          add = \reg.line\, conf.int = TRUE, 
         # cor.coef = TRUE, cor.method = \pearson\,
          xlab = \DNAm GA cord blood (weeks)\, ylab = \DNAmGA Placenta (weeks)\, subtitle=\ ITU (n = 390)\)+
   stat_cor(label.x = 32, label.y=44,p.accuracy = 0.001, r.accuracy = 0.01)+
  theme(axis.text.x = element_text(size=9), axis.text.y=element_text(size=9), axis.title.y = element_text(size=12), axis.title.x=element_text(size=12),
  panel.grid.major = element_blank(),
  panel.grid.minor = element_blank())+
  scale_y_continuous(limits = c(30,44), breaks = seq(30,44, by=2))+
 scale_x_continuous(limits = c(32,44), breaks = seq(32,44, by=2))

<!-- rnb-source-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->



<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxucG5nKGZpbGU9XCJSZXN1bHRzL0ZpZ3VyZXMvZGlmZlRpc3N1ZXMvRE5BbUdBX0NvcmRfUGxhY2VudGFfSVRVLnBuZ1wiLCB3aWR0aD0gMjYwMCwgaGVpZ2h0PTE2MDAsIHJlcz01MDApXG5jb3JfY29yZF9wbGFjZW50YV9kbmFtZ2FcbmRldi5vZmYoKVxuYGBgIn0= -->

```r
png(file="Results/Figures/diffTissues/DNAmGA_Cord_Placenta_ITU.png", width= 2600, height=1600, res=500)
cor_cord_placenta_dnamga
dev.off()

Cord blood and Placenta (in PREDO)

```r
DNAmGAsPREDO <- Data_PREDO_EPIC_Cord_Placenta[ ,c(\DNAmGA_Bohlin\,\DNAmGA_Lee\, \Gestational_Age\)]
colnames(DNAmGAsPREDO) <- c(\Cordblood\, \Placenta\, \GA_birth\)

<!-- rnb-source-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->



<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYWxsY29ycnNETkFtR0FzUFJFRE8gPC0gcmNvcnIoYXMubWF0cml4KEROQW1HQXNQUkVETykpXG5hbGxjb3Jyc0ROQW1HQXNQUkVET1xuYGBgIn0= -->

```r
allcorrsDNAmGAsPREDO <- rcorr(as.matrix(DNAmGAsPREDO))
allcorrsDNAmGAsPREDO
# partial correlation
pcor.test(x=DNAmGAsPREDO$Cord, y=DNAmGAsPREDO$Placenta, z=DNAmGAsPREDO[,c("GA_birth")])
```r
cor_cord_placenta_dnamga_predo <-ggscatter(Data_PREDO_EPIC_Cord_Placenta, x = \DNAmGA_Bohlin\, y = \DNAmGA_Lee\, 
          add = \reg.line\, conf.int = TRUE, 
         # cor.coef = TRUE, cor.method = \pearson\,
          xlab = \DNAm GA cord blood (weeks)\, ylab = \DNAmGA Placenta (weeks)\, subtitle=\ PREDO (n = 116)\)+
   stat_cor(label.x = 34, label.y=42,p.accuracy = 0.001, r.accuracy = 0.01)+
  theme(axis.text.x = element_text(size=9), axis.text.y=element_text(size=9), axis.title.y = element_text(size=12), axis.title.x=element_text(size=12),
  panel.grid.major = element_blank(),
  panel.grid.minor = element_blank()) +
  scale_y_continuous(limits = c(32,42), breaks = seq(32,42, by=2))+
 scale_x_continuous(limits = c(34,42), breaks = seq(34,42, by=2))

<!-- rnb-source-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->



<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxucG5nKGZpbGU9XCJSZXN1bHRzL0ZpZ3VyZXMvZGlmZlRpc3N1ZXMvRE5BbUdBX0NvcmRfUGxhY2VudGFfUFJFRE8ucG5nXCIsIHdpZHRoPSAyNjAwLCBoZWlnaHQ9MTYwMCwgcmVzPTUwMClcbmNvcl9jb3JkX3BsYWNlbnRhX2RuYW1nYV9wcmVkb1xuZGV2Lm9mZigpXG5gYGAifQ== -->

```r
png(file="Results/Figures/diffTissues/DNAmGA_Cord_Placenta_PREDO.png", width= 2600, height=1600, res=500)
cor_cord_placenta_dnamga_predo
dev.off()

CVS and Placenta

```r
DNAmGAs_CP <- Data_CVS_Placenta_ITU[ ,c(\DNAmGA_Lee_CVS\,\DNAmGA_Lee_Placenta\, \gestage_at_CVS_weeks\, \Gestational_Age_Weeks\)]
colnames(DNAmGAs_CP) <- c(\CVS\, \Placenta\, \GA_CVS\, \GA_Birth\)

<!-- rnb-source-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->



<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuQ1Bjb3JyRE5BbUdBcyA8LSByY29ycihhcy5tYXRyaXgoRE5BbUdBc19DUCkpXG5DUGNvcnJETkFtR0FzXG5gYGAifQ== -->

```r
CPcorrDNAmGAs <- rcorr(as.matrix(DNAmGAs_CP))
CPcorrDNAmGAs
# partial correlation
pcor.test(x=DNAmGAs_CP$CVS, y=DNAmGAs_CP$Placenta, z=DNAmGAs_CP[,c("GA_CVS","GA_Birth")])
```r
cor_cvs_placenta_dnamga <-ggscatter(Data_CVS_Placenta_ITU, x = \DNAmGA_Lee_CVS\, y = \DNAmGA_Lee_Placenta\, 
          add = \reg.line\, conf.int = TRUE, 
         # cor.coef = TRUE, cor.method = \pearson\,
          xlab = \DNAm GA CVS (weeks)\, ylab = \DNAmGA placenta (weeks)\, subtitle=\ ITU (n = 86)\)+
   stat_cor(label.x = 6, label.y=44, p.accuracy = 0.01, r.accuracy = 0.01)+
  theme(axis.text.x = element_text(size=9), axis.text.y=element_text(size=9), axis.title.y = element_text(size=12), axis.title.x=element_text(size=12),
  panel.grid.major = element_blank(),
  panel.grid.minor = element_blank())+
  scale_y_continuous(limits = c(34,44), breaks = seq(34,44, by=2))+
 scale_x_continuous(limits = c(6,14), breaks = seq(6,14, by=2))

<!-- rnb-source-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->



<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxucG5nKGZpbGU9XCJSZXN1bHRzL0ZpZ3VyZXMvZGlmZlRpc3N1ZXMvRE5BbUdBX0NWU19QbGFjZW50YS5wbmdcIiwgd2lkdGg9IDI2MDAsIGhlaWdodD0xNjAwLCByZXM9NTAwKVxuY29yX2N2c19wbGFjZW50YV9kbmFtZ2FcbmRldi5vZmYoKVxuYGBgIn0= -->

```r
png(file="Results/Figures/diffTissues/DNAmGA_CVS_Placenta.png", width= 2600, height=1600, res=500)
cor_cvs_placenta_dnamga
dev.off()

CVS and Cord blood

```r
DNAmGAs_CC <- Data_CVS_Cord_ITU[ ,c(\DNAmGA_Lee\,\DNAmGA_Bohlin\, \gestage_at_CVS_weeks\, \Gestational_Age_Weeks\)]
colnames(DNAmGAs_CC) <- c(\CVS\, \Cord blood\, \GA_CVS\, \GA_Birth\)

<!-- rnb-source-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->



<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuQ0Njb3JyRE5BbUdBcyA8LSByY29ycihhcy5tYXRyaXgoRE5BbUdBc19DQykpXG5DQ2NvcnJETkFtR0FzXG5gYGAifQ== -->

```r
CCcorrDNAmGAs <- rcorr(as.matrix(DNAmGAs_CC))
CCcorrDNAmGAs
# partial correlation
pcor.test(x=DNAmGAs_CC$CVS, y=DNAmGAs_CC$Cord, z=DNAmGAs_CC[,c("GA_CVS","GA_Birth")])
```r
cor_cvs_cord_dnamga <- ggscatter(Data_CVS_Cord_ITU, x = \DNAmGA_Lee\, y = \DNAmGA_Bohlin\, 
          add = \reg.line\, conf.int = TRUE, 
         # cor.coef = TRUE, cor.method = \pearson\,
          xlab = \DNAm GA CVS (weeks)\, ylab = \DNAmGA cord blood (weeks)\, subtitle=\ ITU (n = 73)\)+
   stat_cor(label.x = 6, label.y=42,p.accuracy = 0.01, r.accuracy = 0.01)+
  theme(axis.text.x = element_text(size=9), axis.text.y=element_text(size=9), axis.title.y = element_text(size=12), axis.title.x=element_text(size=12),
  panel.grid.major = element_blank(),
  panel.grid.minor = element_blank())+
  scale_y_continuous(limits = c(32,42), breaks = seq(32,42, by=2))+
 scale_x_continuous(limits = c(6,14), breaks = seq(6,14, by=2))

<!-- rnb-source-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->



<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxucG5nKGZpbGU9XCJSZXN1bHRzL0ZpZ3VyZXMvZGlmZlRpc3N1ZXMvRE5BbUdBX0NWU19Db3JkLnBuZ1wiLCB3aWR0aD0gMjYwMCwgaGVpZ2h0PTE2MDAsIHJlcz01MDApXG5jb3JfY3ZzX2NvcmRfZG5hbWdhXG5kZXYub2ZmKClcbmBgYCJ9 -->

```r
png(file="Results/Figures/diffTissues/DNAmGA_CVS_Cord.png", width= 2600, height=1600, res=500)
cor_cvs_cord_dnamga
dev.off()

to the top

Correspondence EAAR

Fig. 4 Cord blood & Placenta (in ITU)

```r
DNAmGAResidsCBirth <- Data_Cord_Placenta_ITU[ ,c(\EAAR_Bohlin\,\EAAR_Lee\)]
colnames(DNAmGAResidsCBirth) <- c(\Cordblood\, \Placenta\)

<!-- rnb-source-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->



<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYWxsY29ycnNETkFtR0FSZXNpZENCaXJ0aCA8LSByY29ycihhcy5tYXRyaXgoRE5BbUdBUmVzaWRzQ0JpcnRoKSlcbmFsbGNvcnJzRE5BbUdBUmVzaWRDQmlydGhcbmBgYCJ9 -->

```r
allcorrsDNAmGAResidCBirth <- rcorr(as.matrix(DNAmGAResidsCBirth))
allcorrsDNAmGAResidCBirth
cor_cord_placenta_resid <- ggscatter(Data_Cord_Placenta_ITU, x = "EAAR_Bohlin", y = "EAAR_Lee", 
          add = "reg.line", conf.int = TRUE, 
          xlab = "EAAR Cord blood", ylab = "EAAR fetal Placenta")+
          stat_cor(method = "pearson", label.x = -2, label.y = 4, r.digits = 1, p.digits = 2)+
          geom_hline(yintercept=0, linetype="dashed")+
          geom_vline(xintercept=0, linetype="dashed")+
  theme(text = element_text(size=13), axis.text.x = element_text(size=13))+
          coord_cartesian(xlim = c(-2, 2), ylim=c(-4,4)) 

cor_cord_placenta_resid

cor_cord_placenta_resid_f <- ggscatter(Data_Cord_Placenta_ITU, x = "EAAR_Bohlin", y = "EAAR_Lee", 
          add = "reg.line", conf.int = TRUE, 
          xlab = "EAAR Cord blood", ylab = "EAAR fetal Placenta")+
          #stat_cor(method = "pearson", label.x = -2.5, label.y = 5, r.digits = 1, p.digits = 3)+
          geom_hline(yintercept=0, linetype="dashed")+
          geom_vline(xintercept=0, linetype="dashed")+
        theme(text = element_text(size=13), axis.text.x = element_text(size=13))+
          coord_cartesian(xlim = c(-2, 2), ylim=c(-4,4)) 
  #scale_y_continuous(breaks = c(-4,-3,-2,-1,0,1,2,3,4)) +
  #scale_x_continuous(breaks = c(-2,-1,0,1,2))

resid_cordplacenta_itu <- na.omit(Data_Cord_Placenta_ITU[ ,c("Sample_Name", "EAAR_Bohlin", "EAAR_Lee")])
resid_cordplacenta_itu$EAAR_Bohlin_s <- scale(resid_cordplacenta_itu$EAAR_Bohlin)
resid_cordplacenta_itu$EAAR_Lee_s <- scale(resid_cordplacenta_itu$EAAR_Lee)
names(resid_cordplacenta_itu) <- c("Sample_Name", "Cord blood", "Placenta", "EAAR Cord blood (scaled)", "EAAR Placenta (scaled)")
resid_cordplacenta_itu_ls = reshape2::melt(resid_cordplacenta_itu[ ,c(1:3)])
col_resid_cordplacenta_itu_ls <- factor(resid_cordplacenta_itu_ls$Sample_Name)

color_plot = grDevices::colors()[grep('gr(a|e)y', grDevices::colors(), invert = T)]
color_plot <- color_plot[1:363]

box_cord_placenta_resid <- ggplot(data=resid_cordplacenta_itu_ls, aes(x=variable, y=value))+
  geom_boxplot()+
  #geom_point(aes(colour = col_resid_cordplacenta_itu_ls))+
  geom_jitter(aes(colour = col_resid_cordplacenta_itu_ls), size=0.4, alpha=0.9)+
  scale_color_manual(values=color_plot)+
  ylab("epigenetic age acceleration residuals")+ 
  xlab("")+
  theme(legend.position = "none") 

box_cord_placenta_resid

png(filename="Results/Figures/diffTissues/corEAAR_cord_placenta_ITU.png", width=2600, height=1600, res=500)
cor_cord_placenta_resid
dev.off()

png(filename="Results/Figures/diffTissues/corEAAR_cord_placenta_ITU_F.png", width=2600, height=1600, res=500)
cor_cord_placenta_resid_f
dev.off()

png(filename="Results/Figures/diffTissues/boxEAAR_cord_placenta_ITU.png", width=2800, height=1400, res=400)
box_cord_placenta_resid 
dev.off()

#levenes test 
leveneTest(value ~ variable, resid_cordplacenta_itu_ls, center=mean)
# significant
#Levene's Test for Homogeneity of Variance (center = mean)
#       Df F value    Pr(>F)    
#group   1  135.76 < 2.2e-16 ***
#      724
# paired t-test
d <- with(resid_cordplacenta_itu_ls, 
        value[variable == "Cord blood"] - value[variable == "Placenta"])
# Shapiro-Wilk normality test for the differences
shapiro.test(d)
# distribution of the differences (d) are not significantly different from normal distribution. In other words, we can assume the normality

t_paired_itu_resid <- t.test(value ~ variable, data = resid_cordplacenta_itu_ls, paired = TRUE)
t_paired_itu_resid
tidy_t_paired_itu_resid <- broom::tidy(t_paired_itu_resid)

ddply(resid_cordplacenta_itu_ls, .(variable), colwise(mean))
ddply(resid_cordplacenta_itu_ls, .(variable), colwise(sd))


write.csv(tidy_t_paired_itu_resid, "Results/Tables/t_paired_eaar_itu_cordplacenta.csv")

Cord blood and Placenta (in PREDO)

```r
DNAmGAResidCPREDO <- Data_PREDO_EPIC_Cord_Placenta[ ,c(\EAAR_Bohlin\,\EAAR_Lee\)]
colnames(DNAmGAResidCPREDO) <- c(\Cordblood\, \Placenta\)

<!-- rnb-source-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->



<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYWxsY29ycnNETkFtR0FSZXNpZENQUkVETyA8LSByY29ycihhcy5tYXRyaXgoRE5BbUdBUmVzaWRDUFJFRE8pKVxuYWxsY29ycnNETkFtR0FSZXNpZENQUkVET1xuYGBgIn0= -->

```r
allcorrsDNAmGAResidCPREDO <- rcorr(as.matrix(DNAmGAResidCPREDO))
allcorrsDNAmGAResidCPREDO
cor_cord_placenta_resid_predo <- ggscatter(Data_PREDO_EPIC_Cord_Placenta, x = "EAAR_Bohlin", y = "EAAR_Lee", 
          add = "reg.line", conf.int = TRUE, 
          xlab = "EAAR Cord blood", ylab = "EAAR decidual Placenta")+
          stat_cor(method = "pearson", label.x = -2, label.y = 4, r.digits = 1, p.digits = 2)+
          geom_hline(yintercept=0, linetype="dashed")+
          geom_vline(xintercept=0, linetype="dashed")+
        theme(text = element_text(size=13), axis.text.x = element_text(size=13))+
          coord_cartesian(xlim = c(-2, 2), ylim=c(-4,4))

cor_cord_placenta_resid_predo

cor_cord_placenta_resid_predo_f <- ggscatter(Data_PREDO_EPIC_Cord_Placenta, x = "EAAR_Bohlin", y = "EAAR_Lee", 
          add = "reg.line", conf.int = TRUE, 
          xlab = "EAAR Cord blood", ylab = "EAAR decidual Placenta")+
          geom_hline(yintercept=0, linetype="dashed")+
          geom_vline(xintercept=0, linetype="dashed")+
        theme(text = element_text(size=13), axis.text.x = element_text(size=13))+
          coord_cartesian(xlim = c(-2, 2), ylim=c(-4,4))

cor_cord_placenta_resid_predo_f

resid_cordplacenta_predo <- na.omit(Data_PREDO_EPIC_Cord_Placenta[ ,c("Sample_Name", "EAAR_Bohlin", "EAAR_Lee")])
resid_cordplacenta_predo$EAAR_Bohlin_s <- scale(resid_cordplacenta_predo$EAAR_Bohlin)
resid_cordplacenta_predo$EAAR_Lee_s <- scale(resid_cordplacenta_predo$EAAR_Lee)
names(resid_cordplacenta_predo) <- c("Sample_Name", "Cord blood", "Placenta", "EAAR Cord blood (scaled)", "EAAR Placenta (scaled)")
resid_cordplacenta_predo_ls = reshape2::melt(resid_cordplacenta_predo[ ,c(1:3)])
col_resid_cordplacenta_predo_ls <- factor(resid_cordplacenta_predo_ls$Sample_Name)

color_plot = grDevices::colors()[grep('gr(a|e)y', grDevices::colors(), invert = T)]
color_plot <- color_plot[1:116]

box_cord_placenta_resid_predo <- ggplot(data=resid_cordplacenta_predo_ls, aes(x=variable, y=value))+
  geom_boxplot()+
  #geom_point(aes(colour = col_resid_cordplacenta_itu_ls))+
  geom_jitter(aes(colour = col_resid_cordplacenta_predo_ls), size=0.4, alpha=0.9)+
  scale_color_manual(values=color_plot)+
  ylab("epigenetic age acceleration residuals")+ 
  theme(legend.position = "none") 

box_cord_placenta_resid_predo

png(filename="Results/Figures/diffTissues/corEAAR_cord_placenta_PREDO.png", width=2600, height=1600, res=500)
cor_cord_placenta_resid_predo
dev.off()

png(filename="Results/Figures/diffTissues/corEAAR_cord_placenta_PREDO_F.png", width=2600, height=1600, res=500)
cor_cord_placenta_resid_predo_f
dev.off()

png(filename="Results/Figures/diffTissues/boxEAAR_cord_placenta_PREDO.png", width=2800, height=1400, res=400)
box_cord_placenta_resid_predo
dev.off()

#levenes test 
leveneTest(value ~ variable, resid_cordplacenta_predo_ls, center=mean)
# significant
# paired t-test
d <- with(resid_cordplacenta_predo_ls, 
        value[variable == "Cord blood"] - value[variable == "Placenta"])
# Shapiro-Wilk normality test for the differences
shapiro.test(d)
# distribution of the differences (d) are not significantly different from normal distribution. In other words, we can assume the normality

t_paired_predo_resid <- t.test(value ~ variable, data = resid_cordplacenta_predo_ls, paired = TRUE)
tidy_t_paired_predo_resid <- broom::tidy(t_paired_predo_resid)

write.csv(tidy_t_paired_predo_resid, "Results/Tables/t_paired_eaar_predo_cordplacenta.csv")

t_paired_predo_resid
ddply(resid_cordplacenta_predo_ls, .(variable), colwise(mean))
ddply(resid_cordplacenta_predo_ls, .(variable), colwise(sd))

CVS and Placenta

```r
DNAmGAResidCCP <- Data_CVS_Placenta_ITU[ ,c(\EAAR_Lee_CVS\, \EAAR_Lee_Placenta\)]
colnames(DNAmGAResidCCP) <- c(\CVS\, \Placenta\)

<!-- rnb-source-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->



<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYWxsY29ycnNETkFtR0FSZXNpZENDUCA8LSByY29ycihhcy5tYXRyaXgoRE5BbUdBUmVzaWRDQ1ApKVxuYWxsY29ycnNETkFtR0FSZXNpZENDUFxuYGBgIn0= -->

```r
allcorrsDNAmGAResidCCP <- rcorr(as.matrix(DNAmGAResidCCP))
allcorrsDNAmGAResidCCP
cor_cvs_placenta_resid <- ggscatter(Data_CVS_Placenta_ITU, x = "EAAR_Lee_CVS", y = "EAAR_Lee_Placenta", 
          add = "reg.line", conf.int = TRUE, xlab = "EAAR CVS", ylab = "EAAR fetal Placenta")+
         theme(text = element_text(size=13), axis.text.x = element_text(size=13))+
         coord_cartesian(xlim = c(-2, 2), ylim=c(-4,4))+
          stat_cor(method = "pearson", label.x = -2, label.y = 4, r.digits = 2, p.digits = 2)+
          geom_hline(yintercept=0, linetype="dashed")+
          geom_vline(xintercept=0, linetype="dashed")

cor_cvs_placenta_resid

cor_cvs_placenta_resid_f <- ggscatter(Data_CVS_Placenta_ITU, x = "EAAR_Lee_CVS", y = "EAAR_Lee_Placenta", 
          add = "reg.line", conf.int = TRUE, xlab = "EAAR CVS", ylab = "EAAR fetal Placenta")+
          geom_hline(yintercept=0, linetype="dashed")+
          geom_vline(xintercept=0, linetype="dashed")+
        theme(text = element_text(size=13), axis.text.x = element_text(size=13))+
         coord_cartesian(xlim = c(-2, 2), ylim=c(-4,4))

cor_cvs_placenta_resid_f

resid_cvsplacenta_itu <- na.omit(Data_CVS_Placenta_ITU[ ,c("Sample_Name", "EAAR_Lee_CVS", "EAAR_Lee_Placenta")])
resid_cvsplacenta_itu$EAAR_Bohlin_s <- scale(resid_cvsplacenta_itu$EAAR_Lee_CVS)
resid_cvsplacenta_itu$EAAR_Lee_s <- scale(resid_cvsplacenta_itu$EAAR_Lee_Placenta)
names(resid_cvsplacenta_itu) <- c("Sample_Name", "CVS", "Placenta", "EAAR CVS (scaled)", "EAAR Placenta (scaled)")
resid_cvsplacenta_itu_ls = reshape2::melt(resid_cvsplacenta_itu[ ,c(1:3)])
col_resid_cvsplacenta_itu_ls <- factor(resid_cvsplacenta_itu_ls$Sample_Name)

color_plot = grDevices::colors()[grep('gr(a|e)y', grDevices::colors(), invert = T)]
color_plot <- color_plot[1:78]

box_cvs_placenta_resid <- ggplot(data=resid_cvsplacenta_itu_ls, aes(x=variable, y=value))+
  geom_boxplot() +
  #geom_point(aes(colour = col_resid_cordplacenta_itu_ls))+
  geom_jitter(aes(colour = col_resid_cvsplacenta_itu_ls), size=0.4, alpha=0.9)+
  scale_color_manual(values=color_plot)+
  ylab("epigenetic age acceleration residuals")+ 
  xlab("")+
  theme(legend.position = "none") 

box_cvs_placenta_resid

png(filename="Results/Figures/diffTissues/corEAAR_cvs_placenta_ITU.png", width=2600, height=1600, res=500)
cor_cvs_placenta_resid
dev.off()

png(filename="Results/Figures/diffTissues/corEAAR_cvs_placenta_ITU_F.png", width=2600, height= 1600, res=500)
cor_cvs_placenta_resid_f
dev.off()

png(filename="Results/Figures/diffTissues/boxEAAR_cvs_placenta_ITU.png", width=2800, height=1400, res=400)
box_cvs_placenta_resid 
dev.off()

# test if variance in EAAR differes between cvs & placenta using levenes test
leveneTest(value ~ variable, resid_cvsplacenta_itu_ls, center=mean)
# not significant
# paired t-test
d <- with(resid_cvsplacenta_itu_ls, 
        value[variable == "CVS"] - value[variable == "Placenta"])
# Shapiro-Wilk normality test for the differences
shapiro.test(d)
# distribution of the differences (d) are significantly different from normal

t_paired_itu_cvsplacenta_resid <- t.test(value ~ variable, data = resid_cvsplacenta_itu_ls, paired = TRUE)
tidy_t_paired_itu_cvsplacenta_resid <- broom::tidy(t_paired_itu_cvsplacenta_resid)

t_paired_itu_cvsplacenta_resid

write.csv(tidy_t_paired_itu_cvsplacenta_resid, "Results/Tables/t_paired_itu_eaar_cvsplacenta.csv")

ddply(resid_cvsplacenta_itu_ls, .(variable), colwise(mean))
ddply(resid_cvsplacenta_itu_ls, .(variable), colwise(sd))

CVS and Cord blood

```r
DNAmGAResidCC <- Data_CVS_Cord_ITU[ ,c(\EAAR_Lee\, \EAAR_Bohlin\)]
colnames(DNAmGAResidCC) <- c(\CVS\, \Cord\)

<!-- rnb-source-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->



<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYWxsY29ycnNETkFtR0FSZXNpZENDIDwtIHJjb3JyKGFzLm1hdHJpeChETkFtR0FSZXNpZENDKSlcbmFsbGNvcnJzRE5BbUdBUmVzaWRDQ1xuYGBgIn0= -->

```r
allcorrsDNAmGAResidCC <- rcorr(as.matrix(DNAmGAResidCC))
allcorrsDNAmGAResidCC
cor_cvs_cord_resid <- ggscatter(Data_CVS_Cord_ITU, x = "EAAR_Lee", y = "EAAR_Bohlin", 
          add = "reg.line", conf.int = TRUE, xlab = "EAAR CVS", ylab = "EAAR Cord blood")+
          stat_cor(method = "pearson", label.x = -2, label.y = 2, r.digits = 2, p.digits = 2)+
          geom_hline(yintercept=0, linetype="dashed")+
          geom_vline(xintercept=0, linetype="dashed")+
  theme(text = element_text(size=13), axis.text.x = element_text(size=13))+
          coord_cartesian(xlim = c(-2, 2), ylim=c(-2,2))

cor_cvs_cord_resid

cor_cvs_cord_resid_f <- ggscatter(Data_CVS_Cord_ITU, x = "EAAR_Lee", y = "EAAR_Bohlin", 
          add = "reg.line", conf.int = TRUE, xlab = "EAAR CVS", ylab = "EAAR Cord blood")+
          geom_hline(yintercept=0, linetype="dashed")+
          geom_vline(xintercept=0, linetype="dashed")+
  theme(text = element_text(size=13), axis.text.x = element_text(size=13))+
          coord_cartesian(xlim = c(-2, 2), ylim=c(-2,2))

cor_cvs_cord_resid_f

resid_cvscord_itu <- na.omit(Data_CVS_Cord_ITU[ ,c("Sample_Name", "EAAR_Bohlin", "EAAR_Lee")])
resid_cvscord_itu$EAAR_Bohlin_s <- scale(resid_cvscord_itu$EAAR_Bohlin)
resid_cvscord_itu$EAAR_Lee_s <- scale(resid_cvscord_itu$EAAR_Lee)
names(resid_cvscord_itu) <- c("Sample_Name", "Cord blood", "CVS", "EAAR Cord blood (scaled)", "EAAR CVS (scaled)")
resid_cvscord_itu_ls = reshape2::melt(resid_cvscord_itu[ ,c(1:3)])
col_resid_cvscord_itu_ls <- factor(resid_cvscord_itu_ls$Sample_Name)

color_plot = grDevices::colors()[grep('gr(a|e)y', grDevices::colors(), invert = T)]
color_plot <- color_plot[1:363]

box_cvs_cord_resid <- ggplot(data=resid_cvscord_itu_ls, aes(x=variable, y=value))+
  geom_boxplot()+
  #geom_point(aes(colour = col_resid_cordplacenta_itu_ls))+
  geom_jitter(aes(colour = col_resid_cvscord_itu_ls), size=0.4, alpha=0.9)+
  scale_color_manual(values=color_plot)+
  ylab("epigenetic age acceleration residuals")+ 
  xlab("")+
  theme(legend.position = "none") 

box_cvs_cord_resid

png(filename="Results/Figures/diffTissues/corEAAR_cvs_cord_ITU.png", width=2600, height=1600, res=500)
cor_cvs_cord_resid
dev.off()

png(filename="Results/Figures/diffTissues/corEAAR_cvs_cord_ITU_F.png", width=2600, height=1600, res=500)
cor_cvs_cord_resid_f
dev.off()

png(filename="Results/Figures/diffTissues/boxEAAR_cvs_cord_ITU.png", width=2800, height=1400, res=400)
box_cvs_cord_resid 
dev.off()

#levenes test 
leveneTest(value ~ variable, resid_cvscord_itu_ls, center=mean)
# significant
# Levene's Test for Homogeneity of Variance (center = mean)
#        Df F value    Pr(>F)    
# group   1   14.13 0.0002567 ***
#       130   
# paired t-test
d <- with(resid_cvscord_itu_ls, 
        value[variable == "CVS"] - value[variable == "Cord blood"])
# Shapiro-Wilk normality test for the differences
shapiro.test(d)
# distribution of the differences (d) are significantly different from normal

t_paired_itu_cvscord_resid <- t.test(value ~ variable, data = resid_cvscord_itu_ls, paired = TRUE)
tidy_t_paired_itu_cvscord_resid <- broom::tidy(t_paired_itu_cvscord_resid)

wilc_paired_itu_cvscord_resid <- wilcox.test(value ~ variable, data = resid_cvscord_itu_ls, paired = TRUE)
qnorm(wilc_paired_itu_cvscord_resid$p.value/2)
wilcoxonZ(resid_cvscord_itu$`Cord blood`, resid_cvscord_itu$CVS, paired = TRUE)
tidy_wilc_paired_itu_cvscord_resid <- broom::tidy(wilc_paired_itu_cvscord_resid)

write.csv(tidy_t_paired_itu_cvscord_resid, "Results/Tables/t_paired_itu_eaar_cvscord_resid.csv")
write.csv(tidy_wilc_paired_itu_cvscord_resid, "Results/Tables/wilc_paired_itu_eaar_cvscord_resid.csv")

wilc_paired_itu_cvscord_resid
ddply(resid_cvscord_itu_ls, .(variable), colwise(mean))
ddply(resid_cvscord_itu_ls, .(variable), colwise(sd))
png(filename="Results/Figures/diffTissues/EAAR_correlations_tissues.png", width=3000, height=2000, res=300)
gridExtra::grid.arrange(cor_cvs_placenta_resid, cor_cvs_cord_resid, cor_cord_placenta_resid, cor_cord_placenta_resid_predo, ncol = 2)
dev.off()

to the top

Difference in EAAR between Tissues

individuals with data from cordblood + placenta -ITU

```r
# difference between cordblood and placenta
Data_Cord_Placenta_ITU$differenceEAAR <- Data_Cord_Placenta_ITU$EAAR_Bohlin - Data_Cord_Placenta_ITU$EAAR_Lee
#n=390

<!-- rnb-source-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->




<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxuIyBXaGF0IGlzIHRoZSBhYnNvbHV0ZSBkaWZmZXJlbmNlIGJldHdlZW4gY29yZGJsb29kIGFuZCBwbGFjZW50YT9cbkRhdGFfQ29yZF9QbGFjZW50YV9JVFUkYWJzZGlmZmVyZW5jZUVBQVIgPC0gYWJzKERhdGFfQ29yZF9QbGFjZW50YV9JVFUkRUFBUl9Cb2hsaW4gLSBEYXRhX0NvcmRfUGxhY2VudGFfSVRVJEVBQVJfTGVlKVxuYGBgXG5gYGAifQ== -->

```r
```r
# What is the absolute difference between cordblood and placenta?
Data_Cord_Placenta_ITU$absdifferenceEAAR <- abs(Data_Cord_Placenta_ITU$EAAR_Bohlin - Data_Cord_Placenta_ITU$EAAR_Lee)

<!-- rnb-source-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->




<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYm94X2Fic19yZXNpZF9JVFUgPC0gZ2dwbG90KERhdGFfQ29yZF9QbGFjZW50YV9JVFUsIGFlcyh4ID1DaGlsZF9TZXgsIHkgPSBhYnNkaWZmZXJlbmNlRUFBUikpICtcbiAgZ2VvbV9ib3hwbG90KCkgK1xuICBsYWJzKHg9XCJjaGlsZCBzZXhcIiwgeT1cImFic29sdXRlIGRpZmZlcmVuY2UgYmV0d2VlbiBFQUFSc1wiLCB0aXRsZT1cIklUVVwiKVxuXG5tZWx0X0RhdGFfQ29yZF9QbGFjZW50YV9JVFUgPC0gcmVzaGFwZTI6Om1lbHQoRGF0YV9Db3JkX1BsYWNlbnRhX0lUVVsgLGMoXCJFQUFSX0JvaGxpblwiLCBcIkVBQVJfTGVlXCIpXSlcblxuYm94X0VBQVJfY29yZHBsYWNlbnRhX0lUVSA8LSBnZ3Bsb3QobWVsdF9EYXRhX0NvcmRfUGxhY2VudGFfSVRVLCBhZXMoeCA9ZmFjdG9yKHZhcmlhYmxlKSwgeSA9IHZhbHVlKSkgK1xuICBnZW9tX2JveHBsb3QoKSArXG4gIGxhYnMoeD1cIlwiLCB5PVwiRUFBUlwiKStcbiAgc2NhbGVfeF9kaXNjcmV0ZShsYWJlbHMgPSBjKCdjb3JkIGJsb29kJywncGxhY2VudGEnKSlcblxuaGlzdHNfYWJzX3Jlc2lkX0lUVSA8LSBnZ3Bsb3QoRGF0YV9Db3JkX1BsYWNlbnRhX0lUVSwgYWVzKHg9YWJzZGlmZmVyZW5jZUVBQVIpKSsgXG4gIGdlb21faGlzdG9ncmFtKGJpbnM9NTgpK1xuICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzPWMoMCwwLjUsMSwxLjUsMiwyLjUsMywzLjUsNCw0LjUsNSkpK1xuICBsYWJzKHg9XCJhYnNvbHV0ZSBkaWZmZXJlbmNlIGJldHdlZWVuIEVBQVJzIFxcbihjb3JkIGJsb29kIHZzLiBwbGFjZW50YSlcIix5PVwiQ291bnQgKG4gPSAzNjMpXCIpK1xuICB0aGVtZV9idygpK1xuICB0aGVtZSh0ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNSksIGF4aXMudGl0bGUueD0gZWxlbWVudF90ZXh0KHNpemU9MTUpLCBheGlzLnRpdGxlLnk9IGVsZW1lbnRfdGV4dChzaXplPTE1KSlcblxuXG5oaXN0c19yZXNpZF9JVFUgPC0gZ2dwbG90KERhdGFfQ29yZF9QbGFjZW50YV9JVFUsIGFlcyh4PWRpZmZlcmVuY2VFQUFSKSkrIFxuICBnZW9tX2hpc3RvZ3JhbShiaW5zPTU4KStcbiAgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcz1jKC01LCAtNCwgLTMsIC0yLCAtMSwgMCwgMSwgMiwgMywgNCwgNSkpK1xuICBsYWJzKHg9XCJDb3JkIGJsb29kIC0gZmV0YWwgUGxhY2VudGEgKEVBQVJzKVwiLCB5ID0gXCJDb3VudCAobiA9IDM2MylcIikrXG4gIHRoZW1lX2J3KCkrXG4gIHRoZW1lKHRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE1KSwgYXhpcy50aXRsZS54PSBlbGVtZW50X3RleHQoc2l6ZT0xNSksIGF4aXMudGl0bGUueT0gZWxlbWVudF90ZXh0KHNpemU9MTUpKVxuXG5cbmdyaWQuYXJyYW5nZShib3hfYWJzX3Jlc2lkX0lUVSwgaGlzdHNfYWJzX3Jlc2lkX0lUVSwgbmNvbD0yKVxuXG5tZWRpYW4oRGF0YV9Db3JkX1BsYWNlbnRhX0lUVSRhYnNkaWZmZXJlbmNlRUFBUiwgbmEucm09VClcblxuYm94X0VBQVJfY29yZHBsYWNlbnRhX0lUVVxuXG5oaXN0c19yZXNpZF9JVFVcblxuYGBgIn0= -->

```r
box_abs_resid_ITU <- ggplot(Data_Cord_Placenta_ITU, aes(x =Child_Sex, y = absdifferenceEAAR)) +
  geom_boxplot() +
  labs(x="child sex", y="absolute difference between EAARs", title="ITU")

melt_Data_Cord_Placenta_ITU <- reshape2::melt(Data_Cord_Placenta_ITU[ ,c("EAAR_Bohlin", "EAAR_Lee")])

box_EAAR_cordplacenta_ITU <- ggplot(melt_Data_Cord_Placenta_ITU, aes(x =factor(variable), y = value)) +
  geom_boxplot() +
  labs(x="", y="EAAR")+
  scale_x_discrete(labels = c('cord blood','placenta'))

hists_abs_resid_ITU <- ggplot(Data_Cord_Placenta_ITU, aes(x=absdifferenceEAAR))+ 
  geom_histogram(bins=58)+
  scale_x_continuous(breaks=c(0,0.5,1,1.5,2,2.5,3,3.5,4,4.5,5))+
  labs(x="absolute difference betweeen EAARs \n(cord blood vs. placenta)",y="Count (n = 363)")+
  theme_bw()+
  theme(text = element_text(size = 15), axis.title.x= element_text(size=15), axis.title.y= element_text(size=15))


hists_resid_ITU <- ggplot(Data_Cord_Placenta_ITU, aes(x=differenceEAAR))+ 
  geom_histogram(bins=58)+
  scale_x_continuous(breaks=c(-5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5))+
  labs(x="Cord blood - fetal Placenta (EAARs)", y = "Count (n = 363)")+
  theme_bw()+
  theme(text = element_text(size = 15), axis.title.x= element_text(size=15), axis.title.y= element_text(size=15))


grid.arrange(box_abs_resid_ITU, hists_abs_resid_ITU, ncol=2)

median(Data_Cord_Placenta_ITU$absdifferenceEAAR, na.rm=T)

box_EAAR_cordplacenta_ITU

hists_resid_ITU

individuals with data from cord blood and placenta - PREDO

```r
# difference between cordblood and placenta
Data_PREDO_EPIC_Cord_Placenta$differenceEAAR <- Data_PREDO_EPIC_Cord_Placenta$EAAR_Bohlin - Data_PREDO_EPIC_Cord_Placenta$EAAR_Lee

<!-- rnb-source-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->

<div class="alert alert-info">
* variable differenceresidualGAC = residual GA for cordblood minus residual GA for placenta (residual from DNAmGA~GA)    
</div>


<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxuIyBXaGF0IGlzIHRoZSBhYnNvbHV0ZSBkaWZmZXJlbmNlIGJldHdlZW4gY29yZGJsb29kIGFuZCBwbGFjZW50YT9cbkRhdGFfUFJFRE9fRVBJQ19Db3JkX1BsYWNlbnRhJGFic2RpZmZlcmVuY2VFQUFSIDwtIGFicyhEYXRhX1BSRURPX0VQSUNfQ29yZF9QbGFjZW50YSRFQUFSX0JvaGxpbiAtIERhdGFfUFJFRE9fRVBJQ19Db3JkX1BsYWNlbnRhJEVBQVJfTGVlKVxuYGBgXG5gYGAifQ== -->

```r
```r
# What is the absolute difference between cordblood and placenta?
Data_PREDO_EPIC_Cord_Placenta$absdifferenceEAAR <- abs(Data_PREDO_EPIC_Cord_Placenta$EAAR_Bohlin - Data_PREDO_EPIC_Cord_Placenta$EAAR_Lee)

<!-- rnb-source-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->

<div class="alert alert-info">
* variable absdifferenceresidualGAC = absolute difference between residual GA for cordblood vs placenta
</div>


<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYm94X2Fic19yZXNpZF9QUkVETyA8LSBnZ3Bsb3QoRGF0YV9QUkVET19FUElDX0NvcmRfUGxhY2VudGEsIGFlcyh4ID1DaGlsZF9TZXgsIHkgPSBhYnNkaWZmZXJlbmNlRUFBUikpICtcbiAgZ2VvbV9ib3hwbG90KCkgK1xuICBsYWJzKHg9XCJjaGlsZCBzZXhcIiwgeT1cImFic29sdXRlIGRpZmZlcmVuY2UgYmV0d2VlbiBFQUFSc1wiLCB0aXRsZT1cIlBSRURPXCIpXG5cbmhpc3RzX2Fic19yZXNpZF9QUkVETyA8LSBnZ3Bsb3QoRGF0YV9QUkVET19FUElDX0NvcmRfUGxhY2VudGEsIGFlcyh4PWFic2RpZmZlcmVuY2VFQUFSKSkrIFxuICBnZW9tX2hpc3RvZ3JhbShiaW5zPTU4KStcbiAgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcz1jKDAsMC41LDEsMS41LDIsMi41LDMsMy41LDQsNC41LDUpKStcbiAgbGFicyh4PVwiYWJzb2x1dGUgZGlmZmVyZW5jZSBiZXR3ZWVlbiBFQUFScyBcXG4oY29yZCBibG9vZCB2cy4gcGxhY2VudGEpXCIseT1cIkNvdW50IChuID0gMTE2KVwiKStcbiAgdGhlbWVfYncoKStcbiAgdGhlbWUodGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTUpLCBheGlzLnRpdGxlLng9IGVsZW1lbnRfdGV4dChzaXplPTE1KSwgYXhpcy50aXRsZS55PSBlbGVtZW50X3RleHQoc2l6ZT0xNSkpXG5cblxuZ3JpZC5hcnJhbmdlKGJveF9hYnNfcmVzaWRfUFJFRE8sIGhpc3RzX2Fic19yZXNpZF9QUkVETywgbmNvbD0yKVxuXG5tZWRpYW4oRGF0YV9QUkVET19FUElDX0NvcmRfUGxhY2VudGEkYWJzZGlmZmVyZW5jZUVBQVIsIG5hLnJtPVQpXG5cbmhpc3RzX3Jlc2lkX1BSRURPIDwtIGdncGxvdChEYXRhX1BSRURPX0VQSUNfQ29yZF9QbGFjZW50YSwgYWVzKHg9ZGlmZmVyZW5jZUVBQVIpKSsgXG4gIGdlb21faGlzdG9ncmFtKGJpbnM9NTgpK1xuICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzPWMoLTMsLTIsLTEsMCwxLDIsMyw0KSkrXG4gIGxhYnMoeD1cIkNvcmQgYmxvb2QgLSBkZWNpZHVhbCBQbGFjZW50YSAoRUFBUnMpXCIsIHk9XCJDb3VudCAobiA9IDExNilcIikrXG4gIHRoZW1lX2J3KCkrXG4gIHRoZW1lKHRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE1KSwgYXhpcy50aXRsZS54PSBlbGVtZW50X3RleHQoc2l6ZT0xNSksIGF4aXMudGl0bGUueT0gZWxlbWVudF90ZXh0KHNpemU9MTUpKVxuXG4gIFxuXG5oaXN0c19yZXNpZF9QUkVET1xuYGBgIn0= -->

```r
box_abs_resid_PREDO <- ggplot(Data_PREDO_EPIC_Cord_Placenta, aes(x =Child_Sex, y = absdifferenceEAAR)) +
  geom_boxplot() +
  labs(x="child sex", y="absolute difference between EAARs", title="PREDO")

hists_abs_resid_PREDO <- ggplot(Data_PREDO_EPIC_Cord_Placenta, aes(x=absdifferenceEAAR))+ 
  geom_histogram(bins=58)+
  scale_x_continuous(breaks=c(0,0.5,1,1.5,2,2.5,3,3.5,4,4.5,5))+
  labs(x="absolute difference betweeen EAARs \n(cord blood vs. placenta)",y="Count (n = 116)")+
  theme_bw()+
  theme(text = element_text(size = 15), axis.title.x= element_text(size=15), axis.title.y= element_text(size=15))


grid.arrange(box_abs_resid_PREDO, hists_abs_resid_PREDO, ncol=2)

median(Data_PREDO_EPIC_Cord_Placenta$absdifferenceEAAR, na.rm=T)

hists_resid_PREDO <- ggplot(Data_PREDO_EPIC_Cord_Placenta, aes(x=differenceEAAR))+ 
  geom_histogram(bins=58)+
  scale_x_continuous(breaks=c(-3,-2,-1,0,1,2,3,4))+
  labs(x="Cord blood - decidual Placenta (EAARs)", y="Count (n = 116)")+
  theme_bw()+
  theme(text = element_text(size = 15), axis.title.x= element_text(size=15), axis.title.y= element_text(size=15))

  

hists_resid_PREDO

individuals with data from cvs + cordblood

```r
# difference between cvs and cordblood 
Data_CVS_Cord_ITU$differenceEAAR <- Data_CVS_Cord_ITU$EAAR_Lee - Data_CVS_Cord_ITU$EAAR_Bohlin
#n=73

<!-- rnb-source-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->



<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxuIyBXaGF0IGlzIHRoZSBhYnNvbHV0ZSBkaWZmZXJlbmNlIGJldHdlZW4gY29yZGJsb29kIGFuZCBwbGFjZW50YT9cbkRhdGFfQ1ZTX0NvcmRfSVRVJGFic2RpZmZlcmVuY2VFQUFSIDwtIGFicyhEYXRhX0NWU19Db3JkX0lUVSRFQUFSX0xlZSAtIERhdGFfQ1ZTX0NvcmRfSVRVJEVBQVJfQm9obGluKVxuYGBgXG5gYGAifQ== -->

```r
```r
# What is the absolute difference between cordblood and placenta?
Data_CVS_Cord_ITU$absdifferenceEAAR <- abs(Data_CVS_Cord_ITU$EAAR_Lee - Data_CVS_Cord_ITU$EAAR_Bohlin)

<!-- rnb-source-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->



<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYm94X2Fic19yZXNpZF9JVFVfY2MgPC0gZ2dwbG90KERhdGFfQ1ZTX0NvcmRfSVRVLCBhZXMoeCA9Q2hpbGRfU2V4LCB5ID0gYWJzZGlmZmVyZW5jZUVBQVIpKSArXG4gIGdlb21fYm94cGxvdCgpICtcbiAgbGFicyh4PVwiY2hpbGQgc2V4XCIsIHk9XCJhYnNvbHV0ZSBkaWZmZXJlbmNlIGJldHdlZW4gRUFBUnNcIiwgdGl0bGU9XCJJVFVcIilcblxubWVsdF9EYXRhX0NWU19Db3JkX0lUVSA8LSByZXNoYXBlMjo6bWVsdChEYXRhX0NWU19Db3JkX0lUVVsgLGMoXCJFQUFSX0JvaGxpblwiLCBcIkVBQVJfTGVlXCIpXSlcblxuYm94X0VBQVJfY3ZzY29yZF9JVFUgPC0gZ2dwbG90KG1lbHRfRGF0YV9DVlNfQ29yZF9JVFUsIGFlcyh4ID1mYWN0b3IodmFyaWFibGUpLCB5ID0gdmFsdWUpKSArXG4gIGdlb21fYm94cGxvdCgpICtcbiAgbGFicyh4PVwiXCIsIHk9XCJFQUFSXCIpXG4gICNzY2FsZV94X2Rpc2NyZXRlKGxhYmVscyA9IGMoJ2NvcmQgYmxvb2QnLCdwbGFjZW50YScpKVxuXG5oaXN0c19hYnNfcmVzaWRfSVRVX2NjIDwtIGdncGxvdChEYXRhX0NWU19Db3JkX0lUVSwgYWVzKHg9YWJzZGlmZmVyZW5jZUVBQVIpKSsgXG4gIGdlb21faGlzdG9ncmFtKGJpbnM9NTgpK1xuICBsYWJzKHg9XCJhYnNvbHV0ZSBkaWZmZXJlbmNlIGJldHdlZWVuIEVBQVJzIFxcbihjb3JkIGJsb29kIHZzLiBwbGFjZW50YSlcIix5PVwiQ291bnQgKG4gPSA2NilcIikrXG4gIHRoZW1lX2J3KCkrXG4gIHRoZW1lKHRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE1KSwgYXhpcy50aXRsZS54PSBlbGVtZW50X3RleHQoc2l6ZT0xNSksIGF4aXMudGl0bGUueT0gZWxlbWVudF90ZXh0KHNpemU9MTUpKVxuXG5cbmhpc3RzX3Jlc2lkX0lUVV9jYyA8LSBnZ3Bsb3QoRGF0YV9DVlNfQ29yZF9JVFUsIGFlcyh4PWRpZmZlcmVuY2VFQUFSKSkrIFxuICBnZW9tX2hpc3RvZ3JhbShiaW5zPTU4KStcbiAgY29vcmRfY2FydGVzaWFuKHhsaW0gPSBjKC00LCA0KSkrXG4gICNzY2FsZV94X2NvbnRpbnVvdXMobGltaXRzID0gYygtNCwgNCkpK1xuICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzPWMoLTQsLTMsIC0yLCAtMSwgMCwgMSwgMiwgMyw0KSkrXG4gIGxhYnMoeD1cIkNWUyAtIENvcmQgYmxvb2QgKEVBQVJzKVwiLCB5ID0gXCJDb3VudCAobiA9IDY2KVwiKStcbiAgdGhlbWVfYncoKStcbiAgdGhlbWUodGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTUpLCBheGlzLnRpdGxlLng9IGVsZW1lbnRfdGV4dChzaXplPTE1KSwgYXhpcy50aXRsZS55PSBlbGVtZW50X3RleHQoc2l6ZT0xNSkpXG5cblxuZ3JpZC5hcnJhbmdlKGJveF9hYnNfcmVzaWRfSVRVX2NjLCBoaXN0c19hYnNfcmVzaWRfSVRVX2NjLCBuY29sPTIpXG5cbm1lZGlhbihEYXRhX0NWU19Db3JkX0lUVSRhYnNkaWZmZXJlbmNlRUFBUiwgbmEucm09VClcblxuYm94X0VBQVJfY3ZzY29yZF9JVFVcblxuaGlzdHNfcmVzaWRfSVRVX2NjXG5cbmBgYCJ9 -->

```r
box_abs_resid_ITU_cc <- ggplot(Data_CVS_Cord_ITU, aes(x =Child_Sex, y = absdifferenceEAAR)) +
  geom_boxplot() +
  labs(x="child sex", y="absolute difference between EAARs", title="ITU")

melt_Data_CVS_Cord_ITU <- reshape2::melt(Data_CVS_Cord_ITU[ ,c("EAAR_Bohlin", "EAAR_Lee")])

box_EAAR_cvscord_ITU <- ggplot(melt_Data_CVS_Cord_ITU, aes(x =factor(variable), y = value)) +
  geom_boxplot() +
  labs(x="", y="EAAR")
  #scale_x_discrete(labels = c('cord blood','placenta'))

hists_abs_resid_ITU_cc <- ggplot(Data_CVS_Cord_ITU, aes(x=absdifferenceEAAR))+ 
  geom_histogram(bins=58)+
  labs(x="absolute difference betweeen EAARs \n(cord blood vs. placenta)",y="Count (n = 66)")+
  theme_bw()+
  theme(text = element_text(size = 15), axis.title.x= element_text(size=15), axis.title.y= element_text(size=15))


hists_resid_ITU_cc <- ggplot(Data_CVS_Cord_ITU, aes(x=differenceEAAR))+ 
  geom_histogram(bins=58)+
  coord_cartesian(xlim = c(-4, 4))+
  #scale_x_continuous(limits = c(-4, 4))+
  scale_x_continuous(breaks=c(-4,-3, -2, -1, 0, 1, 2, 3,4))+
  labs(x="CVS - Cord blood (EAARs)", y = "Count (n = 66)")+
  theme_bw()+
  theme(text = element_text(size = 15), axis.title.x= element_text(size=15), axis.title.y= element_text(size=15))


grid.arrange(box_abs_resid_ITU_cc, hists_abs_resid_ITU_cc, ncol=2)

median(Data_CVS_Cord_ITU$absdifferenceEAAR, na.rm=T)

box_EAAR_cvscord_ITU

hists_resid_ITU_cc

individuals with data from cvs + placenta

```r
# difference between cvs and placenta 
Data_CVS_Placenta_ITU$differenceEAAR <- Data_CVS_Placenta_ITU$EAAR_Lee_CVS - Data_CVS_Placenta_ITU$EAAR_Lee_Placenta
#n=86

<!-- rnb-source-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->



<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxuIyBXaGF0IGlzIHRoZSBhYnNvbHV0ZSBkaWZmZXJlbmNlIGJldHdlZW4gY29yZGJsb29kIGFuZCBwbGFjZW50YT9cbkRhdGFfQ1ZTX1BsYWNlbnRhX0lUVSRhYnNkaWZmZXJlbmNlRUFBUiA8LSBhYnMoRGF0YV9DVlNfUGxhY2VudGFfSVRVJEVBQVJfTGVlX0NWUyAtIERhdGFfQ1ZTX1BsYWNlbnRhX0lUVSRFQUFSX0xlZV9QbGFjZW50YSlcbmBgYFxuYGBgIn0= -->

```r
```r
# What is the absolute difference between cordblood and placenta?
Data_CVS_Placenta_ITU$absdifferenceEAAR <- abs(Data_CVS_Placenta_ITU$EAAR_Lee_CVS - Data_CVS_Placenta_ITU$EAAR_Lee_Placenta)

<!-- rnb-source-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->



<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYm94X2Fic19yZXNpZF9JVFVfY3AgPC0gZ2dwbG90KERhdGFfQ1ZTX1BsYWNlbnRhX0lUVSwgYWVzKHggPUNoaWxkX1NleCwgeSA9IGFic2RpZmZlcmVuY2VFQUFSKSkgK1xuICBnZW9tX2JveHBsb3QoKSArXG4gIGxhYnMoeD1cImNoaWxkIHNleFwiLCB5PVwiYWJzb2x1dGUgZGlmZmVyZW5jZSBiZXR3ZWVuIEVBQVJzXCIsIHRpdGxlPVwiSVRVXCIpXG5cbm1lbHRfRGF0YV9DVlNfUGxhY2VudGFfSVRVIDwtIHJlc2hhcGUyOjptZWx0KERhdGFfQ1ZTX1BsYWNlbnRhX0lUVVsgLGMoXCJFQUFSX0xlZV9DVlNcIiwgXCJFQUFSX0xlZV9QbGFjZW50YVwiKV0pXG5cbmJveF9FQUFSX2N2c3BsYWNlbnRhX0lUVSA8LSBnZ3Bsb3QobWVsdF9EYXRhX0NWU19QbGFjZW50YV9JVFUsIGFlcyh4ID1mYWN0b3IodmFyaWFibGUpLCB5ID0gdmFsdWUpKSArXG4gIGdlb21fYm94cGxvdCgpICtcbiAgbGFicyh4PVwiXCIsIHk9XCJFQUFSXCIpXG4gICNzY2FsZV94X2Rpc2NyZXRlKGxhYmVscyA9IGMoJ2NvcmQgYmxvb2QnLCdwbGFjZW50YScpKVxuXG5oaXN0c19hYnNfcmVzaWRfSVRVX2NwIDwtIGdncGxvdChEYXRhX0NWU19QbGFjZW50YV9JVFUsIGFlcyh4PWFic2RpZmZlcmVuY2VFQUFSKSkrIFxuICBnZW9tX2hpc3RvZ3JhbShiaW5zPTU4KStcbiAgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcz1jKDAsMC41LDEsMS41LDIsMi41LDMsMy41LDQsNC41LDUpKStcbiAgbGFicyh4PVwiYWJzb2x1dGUgZGlmZmVyZW5jZSBiZXR3ZWVlbiBFQUFScyBcXG4oY29yZCBibG9vZCB2cy4gcGxhY2VudGEpXCIseT1cIkNvdW50IChuID0gNzgpXCIpK1xuICB0aGVtZV9idygpK1xuICB0aGVtZSh0ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNSksIGF4aXMudGl0bGUueD0gZWxlbWVudF90ZXh0KHNpemU9MTUpLCBheGlzLnRpdGxlLnk9IGVsZW1lbnRfdGV4dChzaXplPTE1KSlcblxuXG5oaXN0c19yZXNpZF9JVFVfY3AgPC0gZ2dwbG90KERhdGFfQ1ZTX1BsYWNlbnRhX0lUVSwgYWVzKHg9ZGlmZmVyZW5jZUVBQVIpKSsgXG4gIGdlb21faGlzdG9ncmFtKGJpbnM9NTgpK1xuICBjb29yZF9jYXJ0ZXNpYW4oeGxpbSA9IGMoLTMsIDMpKStcbiAgI3NjYWxlX3hfY29udGludW91cyhsaW1pdHMgPSBjKC00LCA0KSkrXG4gIHNjYWxlX3hfY29udGludW91cyhicmVha3M9YygtMywgLTIsIC0xLCAwLCAxLCAyLCAzKSkrXG4gIGxhYnMoeD1cIkNWUyAtIGZldGFsIFBsYWNlbnRhIChFQUFScylcIiwgeSA9IFwiQ291bnQgKG4gPSA3OClcIikrXG4gIHRoZW1lX2J3KCkrXG4gIHRoZW1lKHRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE1KSwgYXhpcy50aXRsZS54PSBlbGVtZW50X3RleHQoc2l6ZT0xNSksIGF4aXMudGl0bGUueT0gZWxlbWVudF90ZXh0KHNpemU9MTUpKVxuXG5cbmdyaWQuYXJyYW5nZShib3hfYWJzX3Jlc2lkX0lUVV9jcCwgaGlzdHNfYWJzX3Jlc2lkX0lUVV9jcCwgbmNvbD0yKVxuXG5tZWRpYW4oRGF0YV9DVlNfUGxhY2VudGFfSVRVJGFic2RpZmZlcmVuY2VFQUFSLCBuYS5ybT1UKVxuXG5ib3hfRUFBUl9jdnNwbGFjZW50YV9JVFVcblxuaGlzdHNfcmVzaWRfSVRVX2NwXG5cbmBgYCJ9 -->

```r
box_abs_resid_ITU_cp <- ggplot(Data_CVS_Placenta_ITU, aes(x =Child_Sex, y = absdifferenceEAAR)) +
  geom_boxplot() +
  labs(x="child sex", y="absolute difference between EAARs", title="ITU")

melt_Data_CVS_Placenta_ITU <- reshape2::melt(Data_CVS_Placenta_ITU[ ,c("EAAR_Lee_CVS", "EAAR_Lee_Placenta")])

box_EAAR_cvsplacenta_ITU <- ggplot(melt_Data_CVS_Placenta_ITU, aes(x =factor(variable), y = value)) +
  geom_boxplot() +
  labs(x="", y="EAAR")
  #scale_x_discrete(labels = c('cord blood','placenta'))

hists_abs_resid_ITU_cp <- ggplot(Data_CVS_Placenta_ITU, aes(x=absdifferenceEAAR))+ 
  geom_histogram(bins=58)+
  scale_x_continuous(breaks=c(0,0.5,1,1.5,2,2.5,3,3.5,4,4.5,5))+
  labs(x="absolute difference betweeen EAARs \n(cord blood vs. placenta)",y="Count (n = 78)")+
  theme_bw()+
  theme(text = element_text(size = 15), axis.title.x= element_text(size=15), axis.title.y= element_text(size=15))


hists_resid_ITU_cp <- ggplot(Data_CVS_Placenta_ITU, aes(x=differenceEAAR))+ 
  geom_histogram(bins=58)+
  coord_cartesian(xlim = c(-3, 3))+
  #scale_x_continuous(limits = c(-4, 4))+
  scale_x_continuous(breaks=c(-3, -2, -1, 0, 1, 2, 3))+
  labs(x="CVS - fetal Placenta (EAARs)", y = "Count (n = 78)")+
  theme_bw()+
  theme(text = element_text(size = 15), axis.title.x= element_text(size=15), axis.title.y= element_text(size=15))


grid.arrange(box_abs_resid_ITU_cp, hists_abs_resid_ITU_cp, ncol=2)

median(Data_CVS_Placenta_ITU$absdifferenceEAAR, na.rm=T)

box_EAAR_cvsplacenta_ITU

hists_resid_ITU_cp

individuals with data from cvs + cordblood + placenta

```r
resid_Data_Full_ITU <- na.omit(Data_Full_ITU[ ,c(\Sample_Name\, \EAAR_Bohlin\, \EAAR_Lee_CVS\, \EAAR_Lee_Placenta\)]) #60
resid_Data_Full_ITU_z <- resid_Data_Full_ITU[ ,c(\Sample_Name\, \EAAR_Bohlin\, \EAAR_Lee_CVS\, \EAAR_Lee_Placenta\)]

resid_Data_Full_ITU$`Cord blood` <- resid_Data_Full_ITU$EAAR_Bohlin
resid_Data_Full_ITU$CVS <- resid_Data_Full_ITU$EAAR_Lee_CVS
resid_Data_Full_ITU$`Placenta (fetal)` <- resid_Data_Full_ITU$EAAR_Lee_Placenta
resid_Data_Full_ITU$EAAR_Bohlin <- NULL
resid_Data_Full_ITU$EAAR_Lee_CVS <- NULL
resid_Data_Full_ITU$EAAR_Lee_Placenta <- NULL

resid_Data_Full_ITU_z$`Cord blood` <- scale(resid_Data_Full_ITU_z$EAAR_Bohlin)
resid_Data_Full_ITU_z$CVS <- scale(resid_Data_Full_ITU_z$EAAR_Lee_CVS)
resid_Data_Full_ITU_z$`Placenta (fetal)` <- scale(resid_Data_Full_ITU_z$EAAR_Lee_Placenta)
resid_Data_Full_ITU_z$EAAR_Bohlin <- NULL
resid_Data_Full_ITU_z$EAAR_Lee_CVS <- NULL
resid_Data_Full_ITU_z$EAAR_Lee_Placenta <- NULL

<!-- rnb-source-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->



<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxubG9uZ19yZXNpZF9EYXRhX0Z1bGxfSVRVX3ogPC0gbWVsdChhcy5kYXRhLnRhYmxlKHJlc2lkX0RhdGFfRnVsbF9JVFVfeiksIGlkLnZhcnMgPSBcXFNhbXBsZV9OYW1lXFwsIHZhcmlhYmxlLm5hbWUgPSBcXHNhbXBsaW5nXFwpXG5sb25nX3Jlc2lkX0RhdGFfRnVsbF9JVFVfeiRzYW1wbGluZyA8LSBmYWN0b3IobG9uZ19yZXNpZF9EYXRhX0Z1bGxfSVRVX3okc2FtcGxpbmcsIGxldmVscyA9IGMoXFxDVlNcXCwgXFxQbGFjZW50YSAoZmV0YWwpXFwsIFxcQ29yZCBibG9vZFxcKSlcbmBgYFxuYGBgIn0= -->

```r
```r
long_resid_Data_Full_ITU_z <- melt(as.data.table(resid_Data_Full_ITU_z), id.vars = \Sample_Name\, variable.name = \sampling\)
long_resid_Data_Full_ITU_z$sampling <- factor(long_resid_Data_Full_ITU_z$sampling, levels = c(\CVS\, \Placenta (fetal)\, \Cord blood\))

<!-- rnb-source-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->



<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxubG9uZ19yZXNpZF9EYXRhX0Z1bGxfSVRVIDwtIG1lbHQoYXMuZGF0YS50YWJsZShyZXNpZF9EYXRhX0Z1bGxfSVRVKSwgaWQudmFycyA9IFxcU2FtcGxlX05hbWVcXCwgdmFyaWFibGUubmFtZSA9IFxcc2FtcGxpbmdcXClcbmxvbmdfcmVzaWRfRGF0YV9GdWxsX0lUVSRzYW1wbGluZyA8LSBmYWN0b3IobG9uZ19yZXNpZF9EYXRhX0Z1bGxfSVRVJHNhbXBsaW5nLCBsZXZlbHMgPSBjKFxcQ1ZTXFwsIFxcUGxhY2VudGEgKGZldGFsKVxcLCBcXENvcmQgYmxvb2RcXCkpXG5gYGBcbmBgYCJ9 -->

```r
```r
long_resid_Data_Full_ITU <- melt(as.data.table(resid_Data_Full_ITU), id.vars = \Sample_Name\, variable.name = \sampling\)
long_resid_Data_Full_ITU$sampling <- factor(long_resid_Data_Full_ITU$sampling, levels = c(\CVS\, \Placenta (fetal)\, \Cord blood\))

<!-- rnb-source-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->



<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxubGlicmFyeShyYW5kb21jb2xvUilcbm4gPC0gNjBcbnBhbGV0dGUgPC0gZGlzdGluY3RDb2xvclBhbGV0dGUobilcbmBgYFxuYGBgIn0= -->

```r
```r
library(randomcoloR)
n <- 60
palette <- distinctColorPalette(n)

<!-- rnb-source-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->


*Plots*

<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuZ2dwbG90KGxvbmdfcmVzaWRfRGF0YV9GdWxsX0lUVV96LCBhZXMoeD1zYW1wbGluZywgeT12YWx1ZSwgZ3JvdXA9YXMuZmFjdG9yKFNhbXBsZV9OYW1lKSwgY29sb3I9YXMuZmFjdG9yKFNhbXBsZV9OYW1lKSkpICsgXG4gIGdlb21fcG9pbnQoKStcbiAgZ2VvbV9saW5lKCkrXG4gIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXM9cGFsZXR0ZSkrXG4gIHRoZW1lX2J3KCkrXG4gIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9IFwibm9uZVwiKStcbiAgdGhlbWUodGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTUpLCBheGlzLnRpdGxlLng9IGVsZW1lbnRfdGV4dChzaXplPTE1KSwgYXhpcy50aXRsZS55PSBlbGVtZW50X3RleHQoc2l6ZT0xNSkpK1xuICBsYWJzKHg9XCJcIiwgeSA9IFwiei1zdGFuZGFyZGl6ZWQgRUFBUlwiKVxuYGBgIn0= -->

```r
ggplot(long_resid_Data_Full_ITU_z, aes(x=sampling, y=value, group=as.factor(Sample_Name), color=as.factor(Sample_Name))) + 
  geom_point()+
  geom_line()+
  scale_color_manual(values=palette)+
  theme_bw()+
  theme(legend.position = "none")+
  theme(text = element_text(size = 15), axis.title.x= element_text(size=15), axis.title.y= element_text(size=15))+
  labs(x="", y = "z-standardized EAAR")
ggplot(long_resid_Data_Full_ITU, aes(x=sampling, y=value, group=as.factor(Sample_Name), color=as.factor(Sample_Name))) + 
  geom_point()+
  geom_line()+
  scale_color_manual(values=palette)+
  theme_bw()+
  theme(legend.position = "none")+
  theme(text = element_text(size = 15, color="black"), axis.title.x= element_text(size=15, color="black"), axis.title.y= element_text(size=15), axis.text.x=element_text(colour="black"))+
  labs(x="", y = "EAAR (n = 60)")
png(file="Results/Figures/diffTissues/EAAR_CVSCordPlacenta_ITU.png", width=3000, height=1500, res=400)
ggplot(long_resid_Data_Full_ITU, aes(x=sampling, y=value, group=as.factor(Sample_Name), color=as.factor(Sample_Name))) + 
  geom_point()+
  geom_line()+
  scale_color_manual(values=palette)+
  theme_bw()+
  theme(legend.position = "none")+
  theme(text = element_text(size = 11, color="black"), axis.title.x= element_text(size=13, color="black"), axis.title.y= element_text(size=13), axis.text.x=element_text(size=13, colour="black"))+
  labs(x="", y = "EAAR (n = 60)")
dev.off()
png(file="Results/Figures/diffTissues/EAAR_PlacentaCord_ITU.png", width=2500, height=1500, res=400)
hists_abs_resid_ITU
dev.off()

png(file="Results/Figures/diffTissues/EAAR_PlacentaCord_PREDO.png", width=2500, height=1500, res=400)
hists_abs_resid_PREDO
dev.off()

png(file="Results/Figures/diffTissues/EAAR_PlacentaCord.png", width=3500, height=1500, res=400)
grid.arrange(hists_abs_resid_ITU, hists_abs_resid_PREDO, ncol = 2)
dev.off()

png(file="Results/Figures/diffTissues/EAAR_diffCordPlacenta_ITU.png", width=2500, height=1500, res=400)
hists_resid_ITU
dev.off()

png(file="Results/Figures/diffTissues/EAAR_diffCordPlacenta_PREDO.png", width=2500, height=1500, res=400)
hists_resid_PREDO
dev.off()

png(file="Results/Figures/diffTissues/EAAR_diffCVSCord_ITU.png", width=2500, height=1500, res=400)
hists_resid_ITU_cc
dev.off()

png(file="Results/Figures/diffTissues/EAAR_diffPlacentaCVS_ITU.png", width=2500, height=1500, res=400)
hists_resid_ITU_cp
dev.off()

to the top

LS0tCnRpdGxlOiAiY2hhcmFjdGVyaXN0aWNzIG9mIGVwaWdlbmV0aWMgYWdpbmcgYWNyb3NzIGdlc3RhdGlvbmFsL3BlcmluYXRhbCB0aXNzdWVzIgphdXRob3I6ICJMaW5kYSBEaWVja21hbm4iCmRhdGU6ICJNYXJjaCAyMDIxIgpvdXRwdXQ6CiAgIGdpdGh1Yl9kb2N1bWVudDoKICAgaHRtbF9ub3RlYm9vazoKICAgIHRvYzogeWVzCiAgICB0b2NfZmxvYXQ6IHllcwogICAgY29sbGFwc2VkOiBubwogICAgdGhlbWU6IGZsYXRseQogIAotLS0KCgpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KHJlc3VsdHMgPSAiaGlkZSIsIG1lc3NhZ2U9RkFMU0UsIGV2YWw9RkFMU0UpCmBgYAoKKioqCiMjIyMjICoqSnVtcCB0byBzZWN0aW9ucyoqIHsjdG9wfSAgCioqKgoKKipHZW5lcmFsKiogIApbc3RhcnQgd2l0aCBsb2FkaW5nIHBhY2thZ2VzICYgZnVuY3Rpb25zXSgjbG9hZHBhY2tzKSAgCltsb2FkaW5nIGRhdGEgJiBTYW1wbGUgT3ZlcnZpZXddKCNsb2FkRGF0YSkgIAoKUHJlcGFyZSBkYXRhIGZvciBlbGFzdGljIG5ldCBtb2RlbHM6ICAKW0NWUzogZGF0YSBwcmVwYXJhdGlvbiBmb3IgbW9kZWxzXSgjZGF0YXByZXBDVlNJVFUpICAKW0NvcmQgYmxvb2Q6IGRhdGEgcHJlcGFyYXRpb25dKCNkYXRhcHJlcENvcmRJVFUpICAKW1BsYWNlbnRhOiBkYXRhIHByZXBhcmF0aW9uXSgjZGF0YXByZXBQbGFjZW50YUlUVSkgIApbQ29yZCBibG9vZCBFUElDOiBkYXRhIHByZXBhcmF0aW9uXSgjZGF0YXByZXBDb3JkUFJFRE8pICAgCltDb3JkIGJsb29kIDQ1MEs6IGRhdGEgcHJlcGFyYXRpb25dKCNkYXRhcHJlcENvcmQ0NTBLUFJFRE8pICAKW1BsYWNlbnRhOiBkYXRhIHByZXBhcmF0aW9uXSgjZGF0YXByZXBQbGFjZW50YVBSRURPKSAgCgpbU2FtcGxlVmlzdWFsaXphdGlvbl0oI1NhbXBsZXMpICAKCioqQmFzaWNzICYgRGVzY3JpcHRpdmUgU3RhdGlzdGljczoqKiAgCltJVFVdKCNJVFVEZXNjcmlwdGl2ZSkgIApbUFJFRE9dKCNQUkVET0Rlc2NyaXB0aXZlKSAgCgpbY29tcGFyaXNvbiBQUkVETyAmIElUVSBpbiBwcmVkaWN0b3JzXSgjcHJlZGljdG9yc0lUVVBSRURPKSAgCgpbSVRVOiBsb29rIGF0IHByZWRpY3RvcnMgKCYgY29ycmVsYXRpb25zKSwgaW4gZnVsbCBkYXRhIChhbGwgcGVyc29ucyldKCNQcmVkaWN0b3JzSVRVQWxsKSAgCltQUkVETzogbG9vayBhdCBwcmVkaWN0b3JzICgmIGNvcnJlbGF0aW9ucyksIGluIGZ1bGwgZGF0YSAoYWxsIHBlcnNvbnMpXSgjUHJlZGljdG9yc1BSRURPQWxsKSAgCgpbSVRVOiBjb3JyZWxhdGlvbiBETkFtR0EgJiBHQSBmb3IgY2xvY2tzXSgjY29yRE5BbUdBR0FJVFUpICAKW1BSRURPOiBjb3JyZWxhdGlvbiBETkFtR0EgJiBHQSBmb3IgY2xvY2tzXSgjY29yRE5BbUdBR0FQUkVETykgIApbUGxvdHMgY29ycmVsYXRpb24gRE5BbUdBICYgR0FdKCNQbG90Y29yRE5BbUdBR0EpICAKCltDbG9ja3M6IGNvcnJlbGF0aW9uIGNvcmQgYmxvb2QgY2xvY2tzXSgjY29yQ29yZENsb2NrcykgIApbQ2xvY2tzOiBjb3JyZWxhdGlvbiBwbGFjZW50YSBjbG9ja3NdKCNjb3JQbGFjZW50YUNsb2NrcykgIAoKW0lUVTogVmlzdWFsaXphdGlvbiBFQUFSXSgjcGxvdHNFQUFSSVRVKSAgCltQUkVETzogVmlzdWFsaXphdGlvbiBFQUFSXSgjcGxvdHNFQUFSUFJFRE8pICAKCioqU2luZ2xlIFRpc3N1ZXMgQW5hbHlzZXMqKiAgCipJVFUqICAKW0NvcmQgYmxvb2Q6IGVsYXN0aWMgbmV0IG1haW5dKCNlbGFzdGljbmV0Q1ZTSVRVKSAgCltDb3JkIGJsb29kOiBlbGFzdGljIG5ldCBpbmNsdWRpbmcgbWF0ZXJuYWwgYWxjb2hvbCB1c2VdKCNlbGFzdGljbmV0Q29yZElUVV9hKSAgCltDVlM6IGVsYXN0aWMgbmV0IG1haW5dKCNlbGFzdGljbmV0Q1ZTSVRVKSAgCltDVlM6IGVsYXN0aWMgbmV0IGluY2x1ZGluZyBtYXRlcm5hbCBhbGNvaG9sIHVzZV0oI2VsYXN0aWNuZXRDVlNJVFVfYSkgIApbUGxhY2VudGE6IGVsYXN0aWMgbmV0IG1haW5dKCNlbGFzdGljbmV0UGxhY2VudGFJVFUpICAKW1BsYWNlbnRhOiBlbGFzdGljIG5ldCBpbmNsdWRpbmcgbWF0ZXJuYWwgYWxjb2hvbCB1c2VdKCNlbGFzdGljbmV0UGxhY2VudGFJVFVfYSkgIApbUGxhY2VudGE6IGVsYXN0aWMgbmV0IHNwbGl0dGVkIGJ5IHNleF0oI2VsYXN0aWNuZXRQbGFjZW50YUlUVV9zKSAgCipQUkVETyogIApbUGxhY2VudGE6IGVsYXN0aWMgbmV0IG1haW5dKCNlbGFzdGljbmV0UGxhY2VudGFQUkVETykgIApbUGxhY2VudGE6IGVsYXN0aWMgbmV0IGluY2x1ZGluZyBtYXRlcm5hbCBhbGNvaG9sIHVzZV0oI2VsYXN0aWNuZXRQbGFjZW50YVBSRURPX2EpICAKW1BsYWNlbnRhOiBlbGFzdGljIG5ldCBzcGxpdHRlZCBieSBzZXhdKCNlbGFzdGljbmV0UGxhY2VudGFQUkVET19zKSAgCltDb3JkIGJsb29kOiBwcmVkaWN0aW9uXSgjcHJlZGljdGlvbkNvcmRQUkVETykgIApbQ29yZCBibG9vZDogZWxhc3RpYyBuZXQgbWFpbl0oI2VsYXN0aWNuZXRDb3JkUFJFRE8pICAKW0NvcmQgYmxvb2Q6IGVsYXN0aWMgbmV0IG1haW5dKCNlbGFzdGljbmV0Q29yZFBSRURPNDUwKSAgCgoqKkNyb3NzLVRpc3N1ZSBBbmFseXNlcyoqICAKW0ROQW1HQSBiZXR3ZWVuIHRpc3N1ZXNdKCNjb3JUaXNzdWVzRE5BbUdBKSAgCltFQUFSIGJldHdlZW4gdGlzc3Vlc10oI2NvclRpc3N1ZXNFQUFSKSAgCltEaWZmZXJlbmNlIGluIEVBQVIgYmV0d2VlbiBUaXNzdWVzXSgjRGlmZmVyZW5jZUVBQVJUaXNzdWVzKSAgCgoKKioqCgojIGxvYWQgcGFja2FnZXMgeyNsb2FkcGFja3N9ICAKCgo8IS0tIGBgYHtyfSAtLT4KPCEtLSAjIGNyaXRpY2FsIHRvIGRvIHRoaXMgd2hlbmV2ZXIgdXNpbmcgbmV3IFIvY29tcHV0ZXIgKG90aGVyd2lzZSBwcm9ibGVtcyB3aXRoIHJlcGxpY2F0ZSwgYm9vdHN0cmFwcGluZyk6IC0tPgoKPCEtLSBpZiAoICEoImVuc3IiICVpbiUgcm93bmFtZXMoaW5zdGFsbGVkLnBhY2thZ2VzKCkpKSB8fCAocGFja2FnZVZlcnNpb24oImVuc3IiKSA8ICIwLjEuMC45MDAxIiApICkgeyAtLT4KPCEtLSAgIHJlbW90ZXM6Omluc3RhbGxfZ2l0aHViKCdkZXdpdHRwZS9lbnNyJykgLS0+CjwhLS0gfSAtLT4KPCEtLSBgYGAgLS0+Cgo8IS0tIGBgYHtyfSAtLT4KPCEtLSBpbnN0YWxsLnBhY2thZ2VzKCJwc3ljaCIpIC0tPgo8IS0tIGluc3RhbGwucGFja2FnZXMoImNvcnJwbG90IikgLS0+CjwhLS0gaW5zdGFsbC5wYWNrYWdlcygiUm1pc2MiKSAtLT4KPCEtLSBpbnN0YWxsLnBhY2thZ2VzKCJwYXN0ZWNzIikgLS0+CjwhLS0gaW5zdGFsbC5wYWNrYWdlcygicmVzaGFwZTIiKSAtLT4KPCEtLSBpbnN0YWxsLnBhY2thZ2VzKCJnZ3B1YnIiKSAtLT4KPCEtLSBpbnN0YWxsLnBhY2thZ2VzKCJnZ3Bsb3QyIikgLS0+CjwhLS0gaW5zdGFsbC5wYWNrYWdlcygiSG1pc2MiKSAtLT4KPCEtLSBpbnN0YWxsLnBhY2thZ2VzKCJjb3dwbG90IikgLS0+CjwhLS0gaW5zdGFsbC5wYWNrYWdlcygidGliYmxlIikgLS0+CjwhLS0gaW5zdGFsbC5wYWNrYWdlcygiZHBseXIiKSAtLT4KPCEtLSBpbnN0YWxsLnBhY2thZ2VzKCJncmlkRXh0cmEiKSAtLT4KPCEtLSBpbnN0YWxsLnBhY2thZ2VzKCJjYXIiKSAtLT4KPCEtLSBpbnN0YWxsLnBhY2thZ2VzKCJ0aWR5dmVyc2UiKSAtLT4KPCEtLSAjaW5zdGFsbC5wYWNrYWdlcygiY2FyZXQiKSAtLT4KPCEtLSBpbnN0YWxsLnBhY2thZ2VzKCJsZWFwcyIpIC0tPgo8IS0tICNpbnN0YWxsLnBhY2thZ2VzKCJBcHBsaWVkUHJlZGljdGl2ZU1vZGVsaW5nIikgLS0+CjwhLS0gaW5zdGFsbC5wYWNrYWdlcygicGFpcnNEMyIpIC0tPgo8IS0tIGluc3RhbGwucGFja2FnZXMoInJnbCIpIC0tPgo8IS0tIGluc3RhbGwucGFja2FnZXMoInBsb3QzRCIpIC0tPgo8IS0tIGluc3RhbGwucGFja2FnZXMoInBsb3QzRHJnbCIpIC0tPgo8IS0tIGluc3RhbGwucGFja2FnZXMoImdsbW5ldCIpIC0tPgo8IS0tIGluc3RhbGwucGFja2FnZXMoIk1BU1MiKSAtLT4KPCEtLSBpbnN0YWxsLnBhY2thZ2VzKCJzalBsb3QiKSAtLT4KPCEtLSBpbnN0YWxsLnBhY2thZ2VzKCJzamxhYmVsbGVkIikgLS0+CjwhLS0gaW5zdGFsbC5wYWNrYWdlcygic2tpbXIiKSAtLT4KPCEtLSBpbnN0YWxsLnBhY2thZ2VzKCJnZ2ZvcmNlIikgLS0+CjwhLS0gaW5zdGFsbC5wYWNrYWdlcygiZG9NQyIsIHJlcG9zPSJodHRwOi8vUi1Gb3JnZS5SLXByb2plY3Qub3JnIikgLS0+CjwhLS0gaW5zdGFsbC5wYWNrYWdlcygicXdyYXBzMiIpIC0tPgo8IS0tIGluc3RhbGwucGFja2FnZXMoImtuaXRyIikgLS0+CjwhLS0gaW5zdGFsbC5wYWNrYWdlcygibWFncml0dHIiKSAtLT4KPCEtLSBpbnN0YWxsLnBhY2thZ2VzKCJyZW1vdGVzIikgLS0+CjwhLS0gaW5zdGFsbC5wYWNrYWdlcygicXdyYXBzMiIpIC0tPgo8IS0tIGluc3RhbGwucGFja2FnZXMoInJtYXJrZG93biIpIC0tPgo8IS0tIGluc3RhbGwucGFja2FnZXMoImRhdGEudGFibGUiKSAtLT4KPCEtLSBpbnN0YWxsLnBhY2thZ2VzKCJxZ3JhcGgiKSAtLT4KPCEtLSBpbnN0YWxsLnBhY2thZ2VzKCJtaXNjVG9vbHMiKSAtLT4KPCEtLSBpbnN0YWxsLnBhY2thZ2VzKCJha21lZG9pZHMiKSAtLT4KPCEtLSBpbnN0YWxsLnBhY2thZ2VzKCJzdGFyZ2F6ZXIiKSAtLT4KPCEtLSBpbnN0YWxsLnBhY2thZ2VzKCJwcGNvciIpIC0tPgo8IS0tIGluc3RhbGwucGFja2FnZXMoIklzaW5nU2FtcGxlciIpIC0tPgo8IS0tIGBgYCAtLT4KCgpgYGB7cixpbmNsdWRlPUZBTFNFfQojb3B0aW9ucyhzY2lwZW49OTk5KQojb3B0aW9ucyhzY2lwZW49MCkKCmxpYnJhcnkocHN5Y2gpCmxpYnJhcnkoY29ycnBsb3QpCmxpYnJhcnkoUm1pc2MpCmxpYnJhcnkocGFzdGVjcykKbGlicmFyeShyZXNoYXBlMikKbGlicmFyeShnZ3B1YnIpCmxpYnJhcnkoZ2dwbG90MikKbGlicmFyeShIbWlzYykKbGlicmFyeShjb3dwbG90KQpsaWJyYXJ5KHRpYmJsZSkKbGlicmFyeShkcGx5cikKbGlicmFyeShncmlkRXh0cmEpCmxpYnJhcnkoY2FyKQpsaWJyYXJ5KHRpZHl2ZXJzZSkKbGlicmFyeShsZWFwcykKbGlicmFyeShwYWlyc0QzKQpsaWJyYXJ5KHJnbCkKbGlicmFyeShwbG90M0QpCmxpYnJhcnkocGxvdDNEcmdsKQpsaWJyYXJ5KGdsbW5ldCkKbGlicmFyeShNQVNTKQpsaWJyYXJ5KHNqUGxvdCkKbGlicmFyeShzamxhYmVsbGVkKQpsaWJyYXJ5KHNraW1yKQpsaWJyYXJ5KGVuc3IpCmxpYnJhcnkoZ2dmb3JjZSkKbGlicmFyeShkb01DKQpsaWJyYXJ5KHF3cmFwczIpCmxpYnJhcnkoa25pdHIpCmxpYnJhcnkobWFncml0dHIpCmxpYnJhcnkocmVtb3RlcykKbGlicmFyeShxd3JhcHMyKQpsaWJyYXJ5KHJtYXJrZG93bikKbGlicmFyeShkYXRhLnRhYmxlKQpsaWJyYXJ5KHFncmFwaCkKbGlicmFyeShtaXNjVG9vbHMpCmxpYnJhcnkoYWttZWRvaWRzKQpsaWJyYXJ5KHN0YXJnYXplcikKbGlicmFyeShwcGNvcikKbGlicmFyeShJc2luZ1NhbXBsZXIpCmxpYnJhcnkod3JpdGV4bCkKbGlicmFyeShldWxlcnIpCmxpYnJhcnkoVmVubkRpYWdyYW0pCmxpYnJhcnkoSG90ZWxsaW5nKQpsaWJyYXJ5KHJyY292KQpsaWJyYXJ5KHJjb21wYW5pb24pCmBgYAoKYGBge3J9CiMgb3V0bGllciBmdW5jdGlvbiBmb3IgZGVzY3JpcHRpdmUgZ3JhcGhzCmlzX291dGxpZXIgPC0gZnVuY3Rpb24oeCkgewogIHJldHVybih4IDwgcXVhbnRpbGUoeCwgMC4yNSkgLSAxLjUgKiBJUVIoeCkgfCB4ID4gcXVhbnRpbGUoeCwgMC43NSkgKyAxLjUgKiBJUVIoeCkpfQoKIyBlbGJvdyBmaW5kZXIgZm9yIG51bWJlciBvZiBuemVybyBjb2VmZmljaWVudHMKZWxib3dfZmluZGVyIDwtIGZ1bmN0aW9uKHhfdmFsdWVzLCB5X3ZhbHVlcykgewogICMgTWF4IHZhbHVlcyB0byBjcmVhdGUgbGluZQogIG1heF94X3ggPC0gbWF4KHhfdmFsdWVzKQogIG1heF94X3kgPC0geV92YWx1ZXNbd2hpY2gubWF4KHhfdmFsdWVzKV0KICBtYXhfeV95IDwtIG1heCh5X3ZhbHVlcykKICBtYXhfeV94IDwtIHhfdmFsdWVzW3doaWNoLm1heCh5X3ZhbHVlcyldCiAgbWF4X2RmIDwtIGRhdGEuZnJhbWUoeCA9IGMobWF4X3lfeCwgbWF4X3hfeCksIHkgPSBjKG1heF95X3ksIG1heF94X3kpKQogIAogICMgQ3JlYXRpbmcgc3RyYWlnaHQgbGluZSBiZXR3ZWVuIHRoZSBtYXggdmFsdWVzCiAgZml0IDwtIGxtKG1heF9kZiR5IH4gbWF4X2RmJHgpCiAgCiAgIyBEaXN0YW5jZSBmcm9tIHBvaW50IHRvIGxpbmUKICBkaXN0YW5jZXMgPC0gYygpCiAgZm9yKGkgaW4gMTpsZW5ndGgoeF92YWx1ZXMpKSB7CiAgICBkaXN0YW5jZXMgPC0gYyhkaXN0YW5jZXMsIGFicyhjb2VmKGZpdClbMl0qeF92YWx1ZXNbaV0gLSB5X3ZhbHVlc1tpXSArIGNvZWYoZml0KVsxXSkgLyBzcXJ0KGNvZWYoZml0KVsyXV4yICsgMV4yKSkKICB9CiAgCiAgIyBNYXggZGlzdGFuY2UgcG9pbnQKICB4X21heF9kaXN0IDwtIHhfdmFsdWVzW3doaWNoLm1heChkaXN0YW5jZXMpXQogIHlfbWF4X2Rpc3QgPC0geV92YWx1ZXNbd2hpY2gubWF4KGRpc3RhbmNlcyldCiAgCiAgcmV0dXJuKGMoeF9tYXhfZGlzdCwgeV9tYXhfZGlzdCkpCn0KYGBgCgoKYGBge3J9Cm9wdGlvbnMoc2NpcGVuPTk5OSkKYGBgCgpgYGB7cn0Kd3JpdGVMaW5lcyhjYXB0dXJlLm91dHB1dChzZXNzaW9uSW5mbygpKSwgInNlc3Npb25JbmZvLnR4dCIpCmBgYAoKIyBMb2FkIHNhdmVkIGRhdGEgdG8gc3RhcnQgZnJvbSBoZXJlIHsjbG9hZERhdGF9ICAKTm90ZSB0aGF0IHRoZSB3b3JraW5nIGRpcmVjdG9yeSBpcyB0aGUgZGlyZWN0b3J5IHdoZXJlIHRoZSBTY3JpcHQgaXMgbG9jYXRlZAoKSGVyZSBJIHByb3ZpZGUgdGhlIHByZXBhcmVkIERhdGE6CmBgYHtyfQpsb2FkKGZpbGU9ICJJbnB1dERhdGEvQ2xvY2tDYWxjdWxhdGlvbnNJbnB1dC9EYXRhX0NWU19JVFUuUmRhdGEiKQpsb2FkKGZpbGU9ICJJbnB1dERhdGEvQ2xvY2tDYWxjdWxhdGlvbnNJbnB1dC9EYXRhX0NvcmRfSVRVLlJkYXRhIikKbG9hZChmaWxlPSAiSW5wdXREYXRhL0Nsb2NrQ2FsY3VsYXRpb25zSW5wdXQvRGF0YV9QbGFjZW50YV9JVFUuUmRhdGEiKQpsb2FkKGZpbGU9IklucHV0RGF0YS9DbG9ja0NhbGN1bGF0aW9uc0lucHV0L0RhdGFfRnVsbF9JVFUuUmRhdGEiKSAjIGRhdGEgcGVyc29ucyB3aXRoIGFsbCBtZWFzdXJlbWVudCBwb2ludHMgYXZhaWxhYmxlCmxvYWQoZmlsZT0iSW5wdXREYXRhL0Nsb2NrQ2FsY3VsYXRpb25zSW5wdXQvRGF0YV9Db3JkX1BsYWNlbnRhX0lUVS5SZGF0YSIpCmxvYWQoZmlsZT0iSW5wdXREYXRhL0Nsb2NrQ2FsY3VsYXRpb25zSW5wdXQvRGF0YV9DVlNfUGxhY2VudGFfSVRVLlJkYXRhIikKbG9hZChmaWxlPSJJbnB1dERhdGEvQ2xvY2tDYWxjdWxhdGlvbnNJbnB1dC9EYXRhX0NWU19Db3JkX0lUVS5SZGF0YSIpCmxvYWQoZmlsZT0iSW5wdXREYXRhL0Nsb2NrQ2FsY3VsYXRpb25zSW5wdXQvRGF0YV9JVFVfYWxsLlJkYXRhIikgIyBhbGwgcGVyc29ucyB0b2dldGhlciBpbiBvbmUgZGF0YSBmcmFtZQoKbG9hZChmaWxlPSAiSW5wdXREYXRhL0Nsb2NrQ2FsY3VsYXRpb25zSW5wdXQvRGF0YV9QbGFjZW50YV9tYWxlX0lUVS5SZGF0YSIpCmxvYWQoZmlsZT0gIklucHV0RGF0YS9DbG9ja0NhbGN1bGF0aW9uc0lucHV0L0RhdGFfUGxhY2VudGFfZmVtYWxlX0lUVS5SZGF0YSIpCgpsb2FkKGZpbGU9IklucHV0RGF0YS9DbG9ja0NhbGN1bGF0aW9uc0lucHV0L0RhdGFfUFJFRE9fNDUwS2NvcmQuUmRhdGEiKQpsb2FkKGZpbGU9IklucHV0RGF0YS9DbG9ja0NhbGN1bGF0aW9uc0lucHV0L0RhdGFfUFJFRE9fRVBJQ2NvcmQuUmRhdGEiKQpsb2FkKGZpbGU9IklucHV0RGF0YS9DbG9ja0NhbGN1bGF0aW9uc0lucHV0L0RhdGFfUFJFRE9fRVBJQ3BsYWNlbnRhLlJkYXRhIikKbG9hZChmaWxlPSJJbnB1dERhdGEvQ2xvY2tDYWxjdWxhdGlvbnNJbnB1dC9EYXRhX1BSRURPX0VQSUNfQ29yZF9QbGFjZW50YS5SZGF0YSIpCmxvYWQoZmlsZT0iSW5wdXREYXRhL0Nsb2NrQ2FsY3VsYXRpb25zSW5wdXQvRGF0YV9QUkVET19FUElDX2FsbC5SZGF0YSIpICMgYWxsIHBlcnNvbnMgd2l0aCBFUElDIGRhdGEgdG9nZXRoZXIgaW4gb25lIGRhdGEgZnJhbWUKCmxvYWQoZmlsZT0iSW5wdXREYXRhL0Nsb2NrQ2FsY3VsYXRpb25zSW5wdXQvRGF0YV9QUkVET19QbGFjZW50YV9tYWxlLlJkYXRhIikKbG9hZChmaWxlPSJJbnB1dERhdGEvQ2xvY2tDYWxjdWxhdGlvbnNJbnB1dC9EYXRhX1BSRURPX1BsYWNlbnRhX2ZlbWFsZS5SZGF0YSIpCmBgYAoKCgo8ZGl2IGNsYXNzPSJhbGVydCBhbGVydC1pbmZvIj4KICA8c3Ryb25nPlRoaXMgaXMgaG93IEkgY2FsY3VsYXRlZCBtZWFzdXJlcyBvZiBhZ2UgYWNjZWxlcmF0aW9uL2RlY2VsZXJhdGlvbjo8L3N0cm9uZz4gIAogIAoqICoqRUFBUiA8LSBhcy5udW1lcmljKHJlc2lkdWFscyhsbShETkFtR0FfTGVlIH4gR2VzdGF0aW9uYWxfQWdlX1dlZWtzICsgVHJvcGhvYmxhc3RzICsgU3Ryb21hbCArIEhvZmJhdWVyICsgRW5kb3RoZWxpYWwgKyBuUkJDICsgU3luY3l0aW90cm9waG9ibGFzdCArIFBDMV9ldGhuaWNpdHkgKyBQQzJfZXRobmljaXR5LCBkYXRhPVgsIG5hLmFjdGlvbj1uYS5leGNsdWRlKSkpKiogIAo9IGEgcG9zaXRpdmUgdmFsdWUgbWVhbnMgYWNjZWxlcmF0aW9uLCBhIG5lZ2F0aXZlIHZhbHVlIGRlY2VsZXJhdGlvbiAKPC9kaXY+CgoKKipTYW1wbGUgb3ZlcnZpZXcqKgohWyBdKFNhbXBsZV9PdmVydmlldy9zYW1wbGVfSVRVLlBORykKIVsgXShTYW1wbGVfT3ZlcnZpZXcvc2FtcGxlX0lUVV8yLlBORykKIVsgXShTYW1wbGVfT3ZlcnZpZXcvc2FtcGxlX1BSRURPLlBORykKIVsgXShTYW1wbGVfT3ZlcnZpZXcvc2FtcGxlX1BSRURPXzIuUE5HKQoKW3RvIHRoZSB0b3BdKCN0b3ApCgoqKkdlbmVyYWwgQ29tbWVudHMqKgoKPHN0cm9uZz5ub3RlIG9uIHRoZSBpbmZsdWVuY2Ugb2YgbWlzc2luZyBDcEdzOjwvc3Ryb25nPiAgCiAgCiogZm9yIHRoZSBjbG9jayBvZiBwbGFjZW50YSAoTGVlKTogbm90IGFsbCBDcEdzIGluY2x1ZGVkIGluIHRoZSBjbG9jayB3b3VsZCBoYXZlIGJlZW4gaW5jbHVkZWQgKmFmdGVyKiBvdXIgUUMsIGhvd2V2ZXIgdGhleSB3ZXJlIHVzZWQgaGVyZSBiZWNhdXNlIHRoZXkgYXJlIG5lZWRlZCBmb3IgdGhlIGNsb2NrIChkaXNjdXNzZWQgd2l0aCBTdGV2ZSBIb3J2YXRoKS4gICAgCiogZm9yIHRoZSBjbG9jayBvZiBwbGFjZW50YSAoTWF5bmUpOiBub3QgYWxsIENwR3Mgb2YgdGhlIGNsb2NrIGFyZSBhdmFpbGFibGUsIGJlY2F1c2UgdGhlIGNsb2NrIHdhcyBhZ2FpbiB0cmFpbmVkIG9uIDQ1MEsvMjdLIGRhdGEuIEFsdGhvdWdoIHRoZSBhdXRob3JzIGhlcmUgZGlkIG5vdCByZXBvcnQgdGhlIGNvbXBhcmFiaWxpdHkgYmV0d2VlbiB0aGUgcmVkdWNlZCBhbmQgZnVsbCBjbG9jaywgd2UgZXhjbHVkZWQgdGhlIDUgbWlzc2luZyBDcEdzICh0aGF0IGFyZSBpbiB0aGUgY2xvY2ssIGJ1dCBub3QgaW4gb3VyIGRhdGEpIGFuZCBwcmVkaWN0ZWQgYWdlLiAgCiogZm9yIHRoZSBjbG9jayBvZiBCb2hsaW4gZXQgYWwuIChjb3JkYmxvb2QpLCA4IENwR3MgYXJlIG1pc3NpbmcgaW4gdGhlIEVQSUMgZGF0YSAoY2xvY2sgZGVzaWduZWQgb24gSWxsdW1pbmEgNDUwSy8yN0svQ0hBUk0gZGF0YSkuIEFnYWluLCB0aGUgYXV0aG9ycyBkaWQgbm90IHJlcG9ydCBhIGNvcnJlbGF0aW9uIGJldHdlZW4gYSByZWR1Y2VkIGFuZCBmdWxsIGNsb2NrLiAgCiogZm9yIHRoZSBjbG9jayBvZiBLbmlnaHQgZXQgYWwuIChjb3JkYmxvb2QpLCA2IENwR3MgYXJlIG1pc3NpbmcgaW4gdGhlIEVQSUMgZGF0YSwgYmVjYXVzZSB0aGUgY2xvY2sgd2FzIGRlc2lnbmVkIG9uIElsbHVtaW5hIDQ1MEsvMjdLIGRhdGEuIEhlcmUsIEtuaWdodCBldCBhbC4gY2xhaW1lZCB0aGF0IHRoZSBjbG9jayB3b3VsZCB3b3JrIGFueXdheXMgKHRlc3RlZCBjb3JyZWxhdGlvbiBiZXR3ZWVuIGVzdGltYXRlcyBmcm9tIHJlZHVjZWQgcHJlZGljdG9yIGFuZCBmdWxsIHByZWRpY3RvcikuCiAgCiogdGhlIGNvcnJlbGF0aW9uIGJldHdlZW4gdGhlIGVzdGltYXRlZCBETkFtR0Egb2YgdGhlIGZ1bGwgYW5kIHJlZHVjZWQgKipCb2hsaW4gY2xvY2sqKiBpcyByPSAuOTkgcCA8IDIuMmUtMTYgKHRlc3RlZCB3aXRoIFBSRURPIDQ1MEspICAgIAoqIHRoZSBtZWFuIG9mIHRoZSB3ZWlnaHRzIG9mIHRoZSBtaXNzaW5nIENwR1Mgb2YgdGhlIEJvaGxpbiBjbG9jayBpcyAtMi4xNTkgIAoqIHRoZSAqcmVwb3J0ZWQqIGNvcnJlbGF0aW9uIGJldHdlZW4gdGhlIGVzdGltYXRlZCBETkFtR0Egb2YgdGhlIGZ1bGwgYW5kIHJlZHVjZWQgKipLbmlnaHQgY2xvY2sqKiBpcyByPS45OTUgIAoqIGluIG91ciBkYXRhIHRoZSBjb3JyZWxhdGlvbiBpcyByPS45NyBwIDwgMi4yZS0xNiAgCiogdGhlIGVzdGltYXRpb24gZnJvbSB0aGUgcmVkdWNlZCBjbG9jayBpcyBhZ2FpbiBvbiBhdmVyYWdlIGhpZ2hlciB0aGFuIHRoZSBlc3RpbWF0aW9uIGZyb20gdGhlIGZ1bGwgY2xvY2sgIAoqIHRoZSBtZWFuIG9mIHRoZSB3ZWlnaHRzIG9mIHRoZSBtaXNzaW5nIENwR1Mgb2YgdGhlIEJvaGxpbiBjbG9jayBpcyAtMC43NjcgIAotPiBvdmVyYWxsLCBib3RoIHRoZSByZWR1Y2VkIGFuZCBmdWxsIGNsb2NrIGNvbWUgdG8gcXVpdGUgc2ltaWxhciByZXN1bHRzLCBidXQgdGhlIG1lYW4gRE5BbSBHQSBlc3RpbWF0ZSBkaWZmZXJzIChhY2NvdW50IGZvciBieSB1c2luZyByZXNpZHVhbHMpICAKCk1jRXdlbiBldCBhbC4gKDIwMTgpIHRlc3RlZCBpZiB0aGUgMTkgQ3BHcyBmcm9tIHRoZSBIb3J2YXRoIGFuZCB0aGUgNiBDcEdzIGZyb20gdGhlIEhhbm51bSBDbG9jayBtaXNzaW5nIG9uIHRoZSBFUElDIGFycmF5IGhhdmUgYSBncmVhdCBpbXBhY3Qgb24gdGhlIHBlcmZvcm1hbmNlIG9mIHRoZSBDbG9ja3MuIFRoZXkgaGFkIGRhdGEgZnJvbSBib3RoIDQ1MEsgYW5kIEVQSUMuIEFkZGl0aW9uYWxseSwgdGhleSB0ZXN0ZWQgdGhlIGluZmx1ZW5jZSBvZiBkaWZmZXJlbnQgcHJlcHJvY2Vzc2luZyBzdHJhdGVnaWVzLiAgCgpodHRwczovL3B1Ym1lZC5uY2JpLm5sbS5uaWguZ292LzMwMzI2OTYzLwoKRGhpbmdyYSBldCBhbC4gKDIwMTkpIGFsc28gZXZhbHVhdGVkIHRoZSBpbmZsdWVuY2Ugb2YgbWlzc2luZyBDcEdzIG9mIHRoZSBIb3J2YXRoIGNsb2NrIGJ5IGNvbXBhcmluZyA0NTBLL0VQSUMgZGF0YS4gIAoKaHR0cHM6Ly9wdWJtZWQubmNiaS5ubG0ubmloLmdvdi8zMTAwMjcxNC8KCkluIHN1bW1hcnksIGl0IGlzIGJldHRlciB0byB1c2UgYWdlLWFkanVzdGVkIHJlc2lkdWFscyBhcyBhIG1lYXN1cmUgb2YgYWdlIGFjY2VsZXJhdGlvbi9kZWNlbGVyYXRpb24sIGNvbXBhcmVkIHRvIHRoZSByYXcgZGlmZmVyZW5jZSBiZXR3ZWVuIGVzdGltYXRlZCBhbmQgY2hyb25vbG9naWNhbCBhZ2UuCgoKIyMjIERhdGEgUHJlcGFyYXRpb24KIyMgQ1ZTLCBkYXRhIHByZXBhcmF0aW9uIGZvciBtb2RlbHMgeyNkYXRhcHJlcENWU0lUVX0gIAoKKnJlZ3Jlc3Npb24gaW5wdXQqCmBgYHtyfQojIEVBQVIsIHdpdGhvdXQgYWxjb2hvbApSZWdfSW5wdXRfRGF0YV9DVlNfSVRVX0VBQVJfbiA8LSBEYXRhX0NWU19JVFVbLCBjKCJFQUFSX0xlZSIsICJDaGlsZF9TZXgiLCAiR2VzdGF0aW9uYWxfQWdlX1dlZWtzIiwgIk1hdGVybmFsX0FnZV9ZZWFycyIsICJzbW9raW5nX2RpY2hvdG9tIiwgIkRlbGl2ZXJ5X21vZGVfZGljaG90b20iLCAiTWF0ZXJuYWxfQm9keV9NYXNzX0luZGV4X2luX0Vhcmx5X1ByZWduYW5jeSIsICJDaGlsZF9CaXJ0aF9XZWlnaHQiLCJDaGlsZF9CaXJ0aF9MZW5ndGgiLCAiQ2hpbGRfSGVhZF9DaXJjdW1mZXJlbmNlX0F0X0JpcnRoIiwiUGFyaXR5X2RpY2hvdG9tIiwgIkluZHVjZWRfTGFib3VyIiwgIk1hdGVybmFsX0h5cGVydGVuc2lvbl9kaWNob3RvbSIsICJNYXRlcm5hbF9EaWFiZXRlc19kaWNob3RvbSIsICJNYXRlcm5hbF9NZW50YWxfRGlzb3JkZXJzIildCgojIEVBQVIsIHdpdGggYWxjb2hvbApSZWdfSW5wdXRfRGF0YV9DVlNfSVRVX0VBQVJfd2EgPC0gRGF0YV9DVlNfSVRVWywgYygiRUFBUl9MZWUiLCAiQ2hpbGRfU2V4IiwgIkdlc3RhdGlvbmFsX0FnZV9XZWVrcyIsICJNYXRlcm5hbF9BZ2VfWWVhcnMiLCAic21va2luZ19kaWNob3RvbSIsICJEZWxpdmVyeV9tb2RlX2RpY2hvdG9tIiwgIk1hdGVybmFsX0JvZHlfTWFzc19JbmRleF9pbl9FYXJseV9QcmVnbmFuY3kiLCAiQ2hpbGRfQmlydGhfV2VpZ2h0IiwiQ2hpbGRfQmlydGhfTGVuZ3RoIiwgIkNoaWxkX0hlYWRfQ2lyY3VtZmVyZW5jZV9BdF9CaXJ0aCIsIlBhcml0eV9kaWNob3RvbSIsICJJbmR1Y2VkX0xhYm91ciIsICJNYXRlcm5hbF9IeXBlcnRlbnNpb25fZGljaG90b20iLCAiTWF0ZXJuYWxfRGlhYmV0ZXNfZGljaG90b20iLCAiTWF0ZXJuYWxfTWVudGFsX0Rpc29yZGVycyIsICJtYXRlcm5hbF9hbGNvaG9sX3VzZSIpXQoKYGBgCgpgYGB7cn0Kc2FwcGx5KFJlZ19JbnB1dF9EYXRhX0NWU19JVFVfRUFBUl9uLCBmdW5jdGlvbih4KSBzdW0oaXMubmEoeCkpKQpzYXBwbHkoUmVnX0lucHV0X0RhdGFfQ1ZTX0lUVV9FQUFSX3dhLCBmdW5jdGlvbih4KSBzdW0oaXMubmEoeCkpKQpgYGAKCmRhdGEgZnJhbWUgd2l0aG91dCBtaXNzaW5ncwoKYGBge3J9ClJlZ19JbnB1dF9EYXRhX0NWU19JVFVfRUFBUl9uX25vTmEgPC0gbmEub21pdChSZWdfSW5wdXRfRGF0YV9DVlNfSVRVX0VBQVJfbikgCmRpbShSZWdfSW5wdXRfRGF0YV9DVlNfSVRVX0VBQVJfbl9ub05hKQpgYGAKCmBgYHtyfQpSZWdfSW5wdXRfRGF0YV9DVlNfSVRVX0VBQVJfd2Ffbm9OYSA8LSBuYS5vbWl0KFJlZ19JbnB1dF9EYXRhX0NWU19JVFVfRUFBUl93YSkgCmRpbShSZWdfSW5wdXRfRGF0YV9DVlNfSVRVX0VBQVJfd2Ffbm9OYSkKYGBgCgpgYGB7cn0Kc2tpbXI6OnNraW0oUmVnX0lucHV0X0RhdGFfQ1ZTX0lUVV9FQUFSX25fbm9OYSkKYGBgCgoKYGBge3J9CnNhdmUoUmVnX0lucHV0X0RhdGFfQ1ZTX0lUVV9FQUFSX25fbm9OYSwgZmlsZT0iSW5wdXREYXRhL0Nsb2NrQ2FsY3VsYXRpb25zSW5wdXQvUmVnX0lucHV0X0RhdGFfQ1ZTX0lUVV9FQUFSX25fbm9OYS5SZGF0YSIpCnNhdmUoUmVnX0lucHV0X0RhdGFfQ1ZTX0lUVV9FQUFSX3dhX25vTmEsIGZpbGU9IklucHV0RGF0YS9DbG9ja0NhbGN1bGF0aW9uc0lucHV0L1JlZ19JbnB1dF9EYXRhX0NWU19JVFVfRUFBUl93YV9ub05hLlJkYXRhIikKYGBgCgpbdG8gdGhlIHRvcF0oI3RvcCkgCgojIyBDb3JkIGJsb29kLCBkYXRhIHByZXBhcmF0aW9uIGZvciBtb2RlbHMgeyNkYXRhcHJlcENvcmRJVFV9CgoqcmVncmVzc2lvbiBpbnB1dCoKCmBgYHtyfQojIEVBQVIgd2l0aG91dCBhbGNvaG9sClJlZ19JbnB1dF9EYXRhX0NvcmRfSVRVX0VBQVJfbiA8LSBEYXRhX0NvcmRfSVRVWywgYygiRUFBUl9Cb2hsaW4iLCAiQ2hpbGRfU2V4IiwgIk1hdGVybmFsX0FnZV9ZZWFycyIsICJzbW9raW5nX2RpY2hvdG9tIiwgIkRlbGl2ZXJ5X21vZGVfZGljaG90b20iLCAiTWF0ZXJuYWxfQm9keV9NYXNzX0luZGV4X2luX0Vhcmx5X1ByZWduYW5jeSIsICJDaGlsZF9CaXJ0aF9XZWlnaHQiLCJDaGlsZF9CaXJ0aF9MZW5ndGgiLCAiQ2hpbGRfSGVhZF9DaXJjdW1mZXJlbmNlX0F0X0JpcnRoIiwiUGFyaXR5X2RpY2hvdG9tIiwgIkluZHVjZWRfTGFib3VyIiwgIk1hdGVybmFsX0h5cGVydGVuc2lvbl9kaWNob3RvbSIsICJNYXRlcm5hbF9EaWFiZXRlc19kaWNob3RvbSIsICJNYXRlcm5hbF9NZW50YWxfRGlzb3JkZXJzIildCgojIEVBQVIgd2l0aCBhbGNvaG9sClJlZ19JbnB1dF9EYXRhX0NvcmRfSVRVX0VBQVJfd2EgPC0gRGF0YV9Db3JkX0lUVVssIGMoIkVBQVJfQm9obGluIiwgIkNoaWxkX1NleCIsICJNYXRlcm5hbF9BZ2VfWWVhcnMiLCAic21va2luZ19kaWNob3RvbSIsICAiRGVsaXZlcnlfbW9kZV9kaWNob3RvbSIsICJNYXRlcm5hbF9Cb2R5X01hc3NfSW5kZXhfaW5fRWFybHlfUHJlZ25hbmN5IiwgIkNoaWxkX0JpcnRoX1dlaWdodCIsIkNoaWxkX0JpcnRoX0xlbmd0aCIsICJDaGlsZF9IZWFkX0NpcmN1bWZlcmVuY2VfQXRfQmlydGgiLCJQYXJpdHlfZGljaG90b20iLCAiSW5kdWNlZF9MYWJvdXIiLCAiTWF0ZXJuYWxfSHlwZXJ0ZW5zaW9uX2RpY2hvdG9tIiwgIk1hdGVybmFsX0RpYWJldGVzX2RpY2hvdG9tIiwgIk1hdGVybmFsX01lbnRhbF9EaXNvcmRlcnMiLCAibWF0ZXJuYWxfYWxjb2hvbF91c2UiKV0KCmBgYAoKYGBge3J9CnNhcHBseShEYXRhX0NvcmRfSVRVLCBmdW5jdGlvbih4KSBzdW0oaXMubmEoeCkpKQpgYGAKCmRhdGEgZnJhbWUgd2l0aG91dCBtaXNzaW5ncwpgYGB7cn0KUmVnX0lucHV0X0RhdGFfQ29yZF9JVFVfRUFBUl9ub05hX24gPC0gbmEub21pdChSZWdfSW5wdXRfRGF0YV9Db3JkX0lUVV9FQUFSX24pIApkaW0oUmVnX0lucHV0X0RhdGFfQ29yZF9JVFVfRUFBUl9ub05hX24pClJlZ19JbnB1dF9EYXRhX0NvcmRfSVRVX0VBQVJfbm9OYV93YSA8LSBuYS5vbWl0KFJlZ19JbnB1dF9EYXRhX0NvcmRfSVRVX0VBQVJfd2EpIApkaW0oUmVnX0lucHV0X0RhdGFfQ29yZF9JVFVfRUFBUl9ub05hX3dhKQpgYGAKCmBgYHtyfQpza2ltcjo6c2tpbShSZWdfSW5wdXRfRGF0YV9Db3JkX0lUVV9FQUFSX25vTmFfbikKYGBgCgoKYGBge3J9CnNhdmUoUmVnX0lucHV0X0RhdGFfQ29yZF9JVFVfRUFBUl9ub05hX3dhLCBmaWxlPSJJbnB1dERhdGEvQ2xvY2tDYWxjdWxhdGlvbnNJbnB1dC9SZWdfSW5wdXRfRGF0YV9Db3JkX0lUVV9FQUFSX25vTmFfd2EuUmRhdGEiKQpzYXZlKFJlZ19JbnB1dF9EYXRhX0NvcmRfSVRVX0VBQVJfbm9OYV9uLCBmaWxlPSJJbnB1dERhdGEvQ2xvY2tDYWxjdWxhdGlvbnNJbnB1dC9SZWdfSW5wdXRfRGF0YV9Db3JkX0lUVV9FQUFSX25vTmFfbi5SZGF0YSIpCmBgYAoKW3RvIHRoZSB0b3BdKCN0b3ApCgojIyBQbGFjZW50YSwgZGF0YSBwcmVwYXJhdGlvbiBmb3IgbW9kZWwgeyNkYXRhcHJlcFBsYWNlbnRhSVRVfSAgCgoqcmVncmVzc2lvbiBpbnB1dCoKYGBge3J9CiMgd2l0aG91dCBhbGNvaG9sClJlZ19JbnB1dF9EYXRhX1BsYWNlbnRhX0lUVV9FQUFSX24gPC0gRGF0YV9QbGFjZW50YV9JVFVbLCBjKCJFQUFSX0xlZSIsICJDaGlsZF9TZXgiLCAiTWF0ZXJuYWxfQWdlX1llYXJzIiwgInNtb2tpbmdfZGljaG90b20iLCAgIkRlbGl2ZXJ5X21vZGVfZGljaG90b20iLCAiTWF0ZXJuYWxfQm9keV9NYXNzX0luZGV4X2luX0Vhcmx5X1ByZWduYW5jeSIsICJDaGlsZF9CaXJ0aF9XZWlnaHQiLCJDaGlsZF9CaXJ0aF9MZW5ndGgiLCAiQ2hpbGRfSGVhZF9DaXJjdW1mZXJlbmNlX0F0X0JpcnRoIiwiUGFyaXR5X2RpY2hvdG9tIiwgIkluZHVjZWRfTGFib3VyIiwgIk1hdGVybmFsX0h5cGVydGVuc2lvbl9kaWNob3RvbSIsICJNYXRlcm5hbF9EaWFiZXRlc19kaWNob3RvbSIsICJNYXRlcm5hbF9NZW50YWxfRGlzb3JkZXJzIildCgojIHdpdGggYWxjb2hvbApSZWdfSW5wdXRfRGF0YV9QbGFjZW50YV9JVFVfRUFBUl93YSA8LSBEYXRhX1BsYWNlbnRhX0lUVVssIGMoIkVBQVJfTGVlIiwgIkNoaWxkX1NleCIsICJNYXRlcm5hbF9BZ2VfWWVhcnMiLCAic21va2luZ19kaWNob3RvbSIsICAiRGVsaXZlcnlfbW9kZV9kaWNob3RvbSIsICJNYXRlcm5hbF9Cb2R5X01hc3NfSW5kZXhfaW5fRWFybHlfUHJlZ25hbmN5IiwgIkNoaWxkX0JpcnRoX1dlaWdodCIsIkNoaWxkX0JpcnRoX0xlbmd0aCIsICJDaGlsZF9IZWFkX0NpcmN1bWZlcmVuY2VfQXRfQmlydGgiLCJQYXJpdHlfZGljaG90b20iLCAiSW5kdWNlZF9MYWJvdXIiLCAiTWF0ZXJuYWxfSHlwZXJ0ZW5zaW9uX2RpY2hvdG9tIiwgIk1hdGVybmFsX0RpYWJldGVzX2RpY2hvdG9tIiwgIk1hdGVybmFsX01lbnRhbF9EaXNvcmRlcnMiLCAibWF0ZXJuYWxfYWxjb2hvbF91c2UiKV0KYGBgCgpgYGB7cn0KIyBmb3Igc3BsaXQgYnkgc2V4CiMgd2l0aCBhbGNvaG9sClJlZ19JbnB1dF9EYXRhX1BsYWNlbnRhX21hbGVfSVRVX0VBQVJfd2EgPC0gRGF0YV9QbGFjZW50YV9tYWxlX0lUVVssIGMoIkVBQVJfTGVlIiwgIkNoaWxkX1NleCIsICJNYXRlcm5hbF9BZ2VfWWVhcnMiLCAic21va2luZ19kaWNob3RvbSIsICAiRGVsaXZlcnlfbW9kZV9kaWNob3RvbSIsICJNYXRlcm5hbF9Cb2R5X01hc3NfSW5kZXhfaW5fRWFybHlfUHJlZ25hbmN5IiwgIkNoaWxkX0JpcnRoX1dlaWdodCIsIkNoaWxkX0JpcnRoX0xlbmd0aCIsICJDaGlsZF9IZWFkX0NpcmN1bWZlcmVuY2VfQXRfQmlydGgiLCJQYXJpdHlfZGljaG90b20iLCAiSW5kdWNlZF9MYWJvdXIiLCAiTWF0ZXJuYWxfSHlwZXJ0ZW5zaW9uX2RpY2hvdG9tIiwgIk1hdGVybmFsX0RpYWJldGVzX2RpY2hvdG9tIiwgIk1hdGVybmFsX01lbnRhbF9EaXNvcmRlcnMiLCAibWF0ZXJuYWxfYWxjb2hvbF91c2UiKV0KCiMgd2l0aG91dCBhbGNvaG9sClJlZ19JbnB1dF9EYXRhX1BsYWNlbnRhX21hbGVfSVRVX0VBQVJfbiA8LSBEYXRhX1BsYWNlbnRhX21hbGVfSVRVWywgYygiRUFBUl9MZWUiLCAiQ2hpbGRfU2V4IiwgIk1hdGVybmFsX0FnZV9ZZWFycyIsICJzbW9raW5nX2RpY2hvdG9tIiwgICJEZWxpdmVyeV9tb2RlX2RpY2hvdG9tIiwgIk1hdGVybmFsX0JvZHlfTWFzc19JbmRleF9pbl9FYXJseV9QcmVnbmFuY3kiLCAiQ2hpbGRfQmlydGhfV2VpZ2h0IiwiQ2hpbGRfQmlydGhfTGVuZ3RoIiwgIkNoaWxkX0hlYWRfQ2lyY3VtZmVyZW5jZV9BdF9CaXJ0aCIsIlBhcml0eV9kaWNob3RvbSIsICJJbmR1Y2VkX0xhYm91ciIsICJNYXRlcm5hbF9IeXBlcnRlbnNpb25fZGljaG90b20iLCAiTWF0ZXJuYWxfRGlhYmV0ZXNfZGljaG90b20iLCAiTWF0ZXJuYWxfTWVudGFsX0Rpc29yZGVycyIpXQoKCiMgd2l0aCBhbGNvaG9sClJlZ19JbnB1dF9EYXRhX1BsYWNlbnRhX2ZlbWFsZV9JVFVfRUFBUl93YSA8LSBEYXRhX1BsYWNlbnRhX2ZlbWFsZV9JVFVbLCBjKCJFQUFSX0xlZSIsICJDaGlsZF9TZXgiLCAiTWF0ZXJuYWxfQWdlX1llYXJzIiwgInNtb2tpbmdfZGljaG90b20iLCAgIkRlbGl2ZXJ5X21vZGVfZGljaG90b20iLCAiTWF0ZXJuYWxfQm9keV9NYXNzX0luZGV4X2luX0Vhcmx5X1ByZWduYW5jeSIsICJDaGlsZF9CaXJ0aF9XZWlnaHQiLCJDaGlsZF9CaXJ0aF9MZW5ndGgiLCAiQ2hpbGRfSGVhZF9DaXJjdW1mZXJlbmNlX0F0X0JpcnRoIiwiUGFyaXR5X2RpY2hvdG9tIiwgIkluZHVjZWRfTGFib3VyIiwgIk1hdGVybmFsX0h5cGVydGVuc2lvbl9kaWNob3RvbSIsICJNYXRlcm5hbF9EaWFiZXRlc19kaWNob3RvbSIsICJNYXRlcm5hbF9NZW50YWxfRGlzb3JkZXJzIiwgIm1hdGVybmFsX2FsY29ob2xfdXNlIildCgojIHdpdGhvdXQgYWxjb2hvbApSZWdfSW5wdXRfRGF0YV9QbGFjZW50YV9mZW1hbGVfSVRVX0VBQVJfbiA8LSBEYXRhX1BsYWNlbnRhX2ZlbWFsZV9JVFVbLCBjKCJFQUFSX0xlZSIsICJDaGlsZF9TZXgiLCAiTWF0ZXJuYWxfQWdlX1llYXJzIiwgInNtb2tpbmdfZGljaG90b20iLCAgIkRlbGl2ZXJ5X21vZGVfZGljaG90b20iLCAiTWF0ZXJuYWxfQm9keV9NYXNzX0luZGV4X2luX0Vhcmx5X1ByZWduYW5jeSIsICJDaGlsZF9CaXJ0aF9XZWlnaHQiLCJDaGlsZF9CaXJ0aF9MZW5ndGgiLCAiQ2hpbGRfSGVhZF9DaXJjdW1mZXJlbmNlX0F0X0JpcnRoIiwiUGFyaXR5X2RpY2hvdG9tIiwgIkluZHVjZWRfTGFib3VyIiwgIk1hdGVybmFsX0h5cGVydGVuc2lvbl9kaWNob3RvbSIsICJNYXRlcm5hbF9EaWFiZXRlc19kaWNob3RvbSIsICJNYXRlcm5hbF9NZW50YWxfRGlzb3JkZXJzIildCgpgYGAKCgpgYGB7cn0Kc2FwcGx5KERhdGFfUGxhY2VudGFfSVRVLCBmdW5jdGlvbih4KSBzdW0oaXMubmEoeCkpKQpgYGAKCgpkYXRhIGZyYW1lIHdpdGhvdXQgbWlzc2luZ3MKYGBge3J9ClJlZ19JbnB1dF9EYXRhX1BsYWNlbnRhX0lUVV9FQUFSX25vTmFfbiA8LSBuYS5vbWl0KFJlZ19JbnB1dF9EYXRhX1BsYWNlbnRhX0lUVV9FQUFSX24pIApkaW0oUmVnX0lucHV0X0RhdGFfUGxhY2VudGFfSVRVX0VBQVJfbm9OYV9uKQoKUmVnX0lucHV0X0RhdGFfUGxhY2VudGFfSVRVX0VBQVJfbm9OYV93YSA8LSBuYS5vbWl0KFJlZ19JbnB1dF9EYXRhX1BsYWNlbnRhX0lUVV9FQUFSX3dhKSAKZGltKFJlZ19JbnB1dF9EYXRhX1BsYWNlbnRhX0lUVV9FQUFSX25vTmFfd2EpCmBgYAoKYGBge3J9CiMgZm9yIHNwbGl0IGJ5IHNleApSZWdfSW5wdXRfRGF0YV9QbGFjZW50YV9tYWxlX0lUVV9FQUFSX25vTmFfd2EgPC0gbmEub21pdChSZWdfSW5wdXRfRGF0YV9QbGFjZW50YV9tYWxlX0lUVV9FQUFSX3dhKSAKZGltKFJlZ19JbnB1dF9EYXRhX1BsYWNlbnRhX21hbGVfSVRVX0VBQVJfbm9OYV93YSkKClJlZ19JbnB1dF9EYXRhX1BsYWNlbnRhX21hbGVfSVRVX0VBQVJfbm9OYV9uIDwtIG5hLm9taXQoUmVnX0lucHV0X0RhdGFfUGxhY2VudGFfbWFsZV9JVFVfRUFBUl9uKSAKZGltKFJlZ19JbnB1dF9EYXRhX1BsYWNlbnRhX21hbGVfSVRVX0VBQVJfbm9OYV9uKQoKClJlZ19JbnB1dF9EYXRhX1BsYWNlbnRhX2ZlbWFsZV9JVFVfRUFBUl9ub05hX3dhIDwtIG5hLm9taXQoUmVnX0lucHV0X0RhdGFfUGxhY2VudGFfZmVtYWxlX0lUVV9FQUFSX3dhKSAKZGltKFJlZ19JbnB1dF9EYXRhX1BsYWNlbnRhX2ZlbWFsZV9JVFVfRUFBUl9ub05hX3dhKQoKUmVnX0lucHV0X0RhdGFfUGxhY2VudGFfZmVtYWxlX0lUVV9FQUFSX25vTmFfbiA8LSBuYS5vbWl0KFJlZ19JbnB1dF9EYXRhX1BsYWNlbnRhX2ZlbWFsZV9JVFVfRUFBUl9uKSAKZGltKFJlZ19JbnB1dF9EYXRhX1BsYWNlbnRhX2ZlbWFsZV9JVFVfRUFBUl9ub05hX24pCgpgYGAKCmBgYHtyfQpza2ltcjo6c2tpbShSZWdfSW5wdXRfRGF0YV9QbGFjZW50YV9JVFVfRUFBUl9ub05hX24pCmBgYAoKCmBgYHtyfQpzYXZlKFJlZ19JbnB1dF9EYXRhX1BsYWNlbnRhX0lUVV9FQUFSX25vTmFfd2EsIGZpbGU9IklucHV0RGF0YS9DbG9ja0NhbGN1bGF0aW9uc0lucHV0L1JlZ19JbnB1dF9EYXRhX1BsYWNlbnRhX0lUVV9FQUFSX25vTmFfd2EuUmRhdGEiKQoKc2F2ZShSZWdfSW5wdXRfRGF0YV9QbGFjZW50YV9JVFVfRUFBUl9ub05hX24sIGZpbGU9IklucHV0RGF0YS9DbG9ja0NhbGN1bGF0aW9uc0lucHV0L1JlZ19JbnB1dF9EYXRhX1BsYWNlbnRhX0lUVV9FQUFSX25vTmFfbi5SZGF0YSIpCgpgYGAKCgpgYGB7cn0Kc2F2ZShSZWdfSW5wdXRfRGF0YV9QbGFjZW50YV9tYWxlX0lUVV9FQUFSX25vTmFfd2EsIGZpbGU9IklucHV0RGF0YS9DbG9ja0NhbGN1bGF0aW9uc0lucHV0L1JlZ19JbnB1dF9EYXRhX1BsYWNlbnRhX21hbGVfSVRVX0VBQVJfbm9OYV93YS5SZGF0YSIpCnNhdmUoUmVnX0lucHV0X0RhdGFfUGxhY2VudGFfbWFsZV9JVFVfRUFBUl9ub05hX24sIGZpbGU9IklucHV0RGF0YS9DbG9ja0NhbGN1bGF0aW9uc0lucHV0L1JlZ19JbnB1dF9EYXRhX1BsYWNlbnRhX21hbGVfSVRVX0VBQVJfbm9OYV9uLlJkYXRhIikKCnNhdmUoUmVnX0lucHV0X0RhdGFfUGxhY2VudGFfZmVtYWxlX0lUVV9FQUFSX25vTmFfd2EsIGZpbGU9IklucHV0RGF0YS9DbG9ja0NhbGN1bGF0aW9uc0lucHV0L1JlZ19JbnB1dF9EYXRhX1BsYWNlbnRhX2ZlbWFsZV9JVFVfRUFBUl9ub05hX3dhLlJkYXRhIikKc2F2ZShSZWdfSW5wdXRfRGF0YV9QbGFjZW50YV9mZW1hbGVfSVRVX0VBQVJfbm9OYV9uLCBmaWxlPSJJbnB1dERhdGEvQ2xvY2tDYWxjdWxhdGlvbnNJbnB1dC9SZWdfSW5wdXRfRGF0YV9QbGFjZW50YV9mZW1hbGVfSVRVX0VBQVJfbm9OYV9uLlJkYXRhIikKYGBgCgoKW3RvIHRoZSB0b3BdKCN0b3ApIAoKCiMjIGNvcmQgYmxvb2QgZGF0YSBwcmVwYXJhdGlvbiBmb3IgbW9kZWwgeyNkYXRhcHJlcENvcmRQUkVET30gIAoqRVBJQyoKCipyZWdyZXNzaW9uIGlucHV0KgoKYGBge3J9CiMgRUFBUiB3aXRob3V0IGFsY29ob2wKUmVnX0lucHV0X0RhdGFfQ29yZGJsb29kX1BSRURPX0VBQVJfbiA8LSBEYXRhX1BSRURPX0VQSUNjb3JkWywgYygiRUFBUl9Cb2hsaW4iLCAiQ2hpbGRfU2V4IiwgIkdlc3RhdGlvbmFsX0FnZSIsICJNYXRlcm5hbF9BZ2VfMThQb3BSZWdhbmRCUiIsICJzbW9raW5nX2RpY2hvdG9tIiwgIkRlbGl2ZXJ5X01vZGVfZGljaG90b20iLCAiTWF0ZXJuYWxfUHJlcHJlZ25hbmN5Qk1JMThvY3QyOG5ldyIsICJCaXJ0aF9XZWlnaHQiLCJCaXJ0aF9MZW5ndGgiLCAiSGVhZF9DaXJjdW1mZXJlbmNlX2F0X0JpcnRoIiwiUGFyaXR5X2RpY2hvdG9tIiwgICJpbmR1Y2VkbGFib3VyIiwgIm1hdGVybmFsX2RpYWJldGVzX2RpY2hvdG9tIiwgIm1hdGVybmFsX2h5cGVydGVuc2lvbl9kaWNob3RvbSIsICJNYXRlcm5hbF9NZW50YWxfRGlzb3JkZXJzX0J5X0NoaWxkYmlydGgiKV0KCiMgRUFBUiB3aXRoIGFsY29ob2wKUmVnX0lucHV0X0RhdGFfQ29yZGJsb29kX1BSRURPX0VBQVJfd2EgPC0gRGF0YV9QUkVET19FUElDY29yZFssIGMoIkVBQVJfQm9obGluIiwgIkNoaWxkX1NleCIsICJHZXN0YXRpb25hbF9BZ2UiLCAiTWF0ZXJuYWxfQWdlXzE4UG9wUmVnYW5kQlIiLCAic21va2luZ19kaWNob3RvbSIsICJBbGNvaG9sX1VzZV9Jbl9FYXJseV9QcmVnbmFuY3lfMTlPY3QiLCAiRGVsaXZlcnlfTW9kZV9kaWNob3RvbSIsICJNYXRlcm5hbF9QcmVwcmVnbmFuY3lCTUkxOG9jdDI4bmV3IiwgIkJpcnRoX1dlaWdodCIsIkJpcnRoX0xlbmd0aCIsICJIZWFkX0NpcmN1bWZlcmVuY2VfYXRfQmlydGgiLCJQYXJpdHlfZGljaG90b20iLCAgImluZHVjZWRsYWJvdXIiLCAibWF0ZXJuYWxfZGlhYmV0ZXNfZGljaG90b20iLCAibWF0ZXJuYWxfaHlwZXJ0ZW5zaW9uX2RpY2hvdG9tIiwgIk1hdGVybmFsX01lbnRhbF9EaXNvcmRlcnNfQnlfQ2hpbGRiaXJ0aCIpXQpgYGAKCgpkYXRhIGZyYW1lIHdpdGhvdXQgbWlzc2luZ3MKYGBge3J9ClJlZ19JbnB1dF9EYXRhX0NvcmRibG9vZF9QUkVET19FQUFSX25vTmFfbiA8LSBuYS5vbWl0KFJlZ19JbnB1dF9EYXRhX0NvcmRibG9vZF9QUkVET19FQUFSX24pIApkaW0oUmVnX0lucHV0X0RhdGFfQ29yZGJsb29kX1BSRURPX0VBQVJfbm9OYV9uKQoKUmVnX0lucHV0X0RhdGFfQ29yZGJsb29kX1BSRURPX0VBQVJfbm9OYV93YSA8LSBuYS5vbWl0KFJlZ19JbnB1dF9EYXRhX0NvcmRibG9vZF9QUkVET19FQUFSX3dhKSAKZGltKFJlZ19JbnB1dF9EYXRhX0NvcmRibG9vZF9QUkVET19FQUFSX25vTmFfd2EpCmBgYAoKYGBge3J9CnNraW1yOjpza2ltKFJlZ19JbnB1dF9EYXRhX0NvcmRibG9vZF9QUkVET19FQUFSX25vTmFfbikKYGBgCgoKYGBge3J9CnNhdmUoUmVnX0lucHV0X0RhdGFfQ29yZGJsb29kX1BSRURPX0VBQVJfbm9OYV93YSwgZmlsZT0iSW5wdXREYXRhL0Nsb2NrQ2FsY3VsYXRpb25zSW5wdXQvUmVnX0lucHV0X0RhdGFfQ29yZGJsb29kX1BSRURPX0VBQVJfbm9OYV93YS5SZGF0YSIpCgpzYXZlKFJlZ19JbnB1dF9EYXRhX0NvcmRibG9vZF9QUkVET19FQUFSX25vTmFfbiwgZmlsZT0iSW5wdXREYXRhL0Nsb2NrQ2FsY3VsYXRpb25zSW5wdXQvUmVnX0lucHV0X0RhdGFfQ29yZGJsb29kX1BSRURPX0VBQVJfbm9OYV9uLlJkYXRhIikKYGBgCgpbdG8gdGhlIHRvcF0oI3RvcCkgCgoKIyMgY29yZCBibG9vZCBkYXRhIHByZXBhcmF0aW9uIGZvciBtb2RlbCB7I2RhdGFwcmVwQ29yZDQ1MEtQUkVET30gIAoqNDUwSyoKCipyZWdyZXNzaW9uIGlucHV0KgoKYGBge3J9CiMgRUFBUiB3aXRob3V0IGFsY29ob2wKUmVnX0lucHV0X0RhdGFfQ29yZGJsb29kX1BSRURPNDUwS19FQUFSX24gPC0gRGF0YV9QUkVET180NTBLY29yZFssIGMoIkVBQVJfQm9obGluIiwgIkNoaWxkX1NleCIsICJHZXN0YXRpb25hbF9BZ2UiLCAiTWF0ZXJuYWxfQWdlXzE4UG9wUmVnYW5kQlIiLCAic21va2luZ19kaWNob3RvbSIsICJEZWxpdmVyeV9Nb2RlX2RpY2hvdG9tIiwgIk1hdGVybmFsX1ByZXByZWduYW5jeUJNSTE4b2N0MjhuZXciLCAiQmlydGhfV2VpZ2h0IiwiQmlydGhfTGVuZ3RoIiwgIkhlYWRfQ2lyY3VtZmVyZW5jZV9hdF9CaXJ0aCIsIlBhcml0eV9kaWNob3RvbSIsICAiaW5kdWNlZGxhYm91ciIsICJtYXRlcm5hbF9kaWFiZXRlc19kaWNob3RvbSIsICJtYXRlcm5hbF9oeXBlcnRlbnNpb25fZGljaG90b20iLCAiTWF0ZXJuYWxfTWVudGFsX0Rpc29yZGVyc19CeV9DaGlsZGJpcnRoIildCgojRUFBUiB3aXRoIGFsY29ob2wKUmVnX0lucHV0X0RhdGFfQ29yZGJsb29kX1BSRURPNDUwS19FQUFSX3dhIDwtIERhdGFfUFJFRE9fNDUwS2NvcmRbLCBjKCJFQUFSX0JvaGxpbiIsICJDaGlsZF9TZXgiLCAiR2VzdGF0aW9uYWxfQWdlIiwgIk1hdGVybmFsX0FnZV8xOFBvcFJlZ2FuZEJSIiwgInNtb2tpbmdfZGljaG90b20iLCAiQWxjb2hvbF9Vc2VfSW5fRWFybHlfUHJlZ25hbmN5XzE5T2N0IiwgIkRlbGl2ZXJ5X01vZGVfZGljaG90b20iLCAiTWF0ZXJuYWxfUHJlcHJlZ25hbmN5Qk1JMThvY3QyOG5ldyIsICJCaXJ0aF9XZWlnaHQiLCJCaXJ0aF9MZW5ndGgiLCAiSGVhZF9DaXJjdW1mZXJlbmNlX2F0X0JpcnRoIiwiUGFyaXR5X2RpY2hvdG9tIiwgICJpbmR1Y2VkbGFib3VyIiwgIm1hdGVybmFsX2RpYWJldGVzX2RpY2hvdG9tIiwgIm1hdGVybmFsX2h5cGVydGVuc2lvbl9kaWNob3RvbSIsICJNYXRlcm5hbF9NZW50YWxfRGlzb3JkZXJzX0J5X0NoaWxkYmlydGgiKV0KYGBgCgoKYGBge3J9CnNhcHBseShSZWdfSW5wdXRfRGF0YV9Db3JkYmxvb2RfUFJFRE80NTBLX0VBQVJfd2EsIGZ1bmN0aW9uKHgpIHN1bShpcy5uYSh4KSkpCmBgYAoKCmRhdGEgZnJhbWUgd2l0aG91dCBtaXNzaW5ncwpgYGB7cn0KUmVnX0lucHV0X0RhdGFfQ29yZGJsb29kX1BSRURPNDUwS19FQUFSX25vTmFfd2EgPC0gbmEub21pdChSZWdfSW5wdXRfRGF0YV9Db3JkYmxvb2RfUFJFRE80NTBLX0VBQVJfd2EpIApkaW0oUmVnX0lucHV0X0RhdGFfQ29yZGJsb29kX1BSRURPNDUwS19FQUFSX25vTmFfd2EpCgpSZWdfSW5wdXRfRGF0YV9Db3JkYmxvb2RfUFJFRE80NTBLX0VBQVJfbm9OYV9uIDwtIG5hLm9taXQoUmVnX0lucHV0X0RhdGFfQ29yZGJsb29kX1BSRURPNDUwS19FQUFSX24pIApkaW0oUmVnX0lucHV0X0RhdGFfQ29yZGJsb29kX1BSRURPNDUwS19FQUFSX25vTmFfbikKYGBgCgpgYGB7cn0Kc2tpbXI6OnNraW0oUmVnX0lucHV0X0RhdGFfQ29yZGJsb29kX1BSRURPX0VBQVJfbm9OYV9uKQpgYGAKCgpgYGB7cn0Kc2F2ZShSZWdfSW5wdXRfRGF0YV9Db3JkYmxvb2RfUFJFRE80NTBLX0VBQVJfbm9OYV93YSwgZmlsZT0iSW5wdXREYXRhL0Nsb2NrQ2FsY3VsYXRpb25zSW5wdXQvUmVnX0lucHV0X0RhdGFfQ29yZGJsb29kX1BSRURPNDUwS19FQUFSX25vTmFfd2EuUmRhdGEiKQoKc2F2ZShSZWdfSW5wdXRfRGF0YV9Db3JkYmxvb2RfUFJFRE80NTBLX0VBQVJfbm9OYV9uLCBmaWxlPSJJbnB1dERhdGEvQ2xvY2tDYWxjdWxhdGlvbnNJbnB1dC9SZWdfSW5wdXRfRGF0YV9Db3JkYmxvb2RfUFJFRE80NTBLX0VBQVJfbm9OYV9uLlJkYXRhIikKYGBgCgpbdG8gdGhlIHRvcF0oI3RvcCkgCgojIyBwbGFjZW50YTogZGF0YSBwcmVwYXJhdGlvbiBmb3IgbW9kZWwgeyNkYXRhcHJlcFBsYWNlbnRhUFJFRE99ICAKKlBsYWNlbnRhIEVQSUMqCgoqcmVncmVzc2lvbiBpbnB1dCoKCmBgYHtyfQojIEVBQVIgKHdpdGggZXRobmljaXR5KSB3aXRob3V0IGFsY29ob2wKUmVnX0lucHV0X0RhdGFfUGxhY2VudGFfUFJFRE9fRUFBUl9uIDwtIERhdGFfUFJFRE9fRVBJQ3BsYWNlbnRhWywgYygiRUFBUl9MZWUiLCAiQ2hpbGRfU2V4IiwgIk1hdGVybmFsX0FnZV8xOFBvcFJlZ2FuZEJSIiwgInNtb2tpbmdfZGljaG90b20iLCAiRGVsaXZlcnlfTW9kZV9kaWNob3RvbSIsICJNYXRlcm5hbF9QcmVwcmVnbmFuY3lCTUkxOG9jdDI4bmV3IiwgIkJpcnRoX1dlaWdodCIsIkJpcnRoX0xlbmd0aCIsICJIZWFkX0NpcmN1bWZlcmVuY2VfYXRfQmlydGgiLCJQYXJpdHlfZGljaG90b20iLCAgImluZHVjZWRsYWJvdXIiLCAibWF0ZXJuYWxfZGlhYmV0ZXNfZGljaG90b20iLCAibWF0ZXJuYWxfaHlwZXJ0ZW5zaW9uX2RpY2hvdG9tIiwgIk1hdGVybmFsX01lbnRhbF9EaXNvcmRlcnNfQnlfQ2hpbGRiaXJ0aCIpXQoKIyBFQUFSICh3aXRoIGV0aG5pY2l0eSkgd2l0aCBhbGNvaG9sClJlZ19JbnB1dF9EYXRhX1BsYWNlbnRhX1BSRURPX0VBQVJfd2EgPC0gRGF0YV9QUkVET19FUElDcGxhY2VudGFbLCBjKCJFQUFSX0xlZSIsICJDaGlsZF9TZXgiLCAiTWF0ZXJuYWxfQWdlXzE4UG9wUmVnYW5kQlIiLCAic21va2luZ19kaWNob3RvbSIsICJBbGNvaG9sX1VzZV9Jbl9FYXJseV9QcmVnbmFuY3lfMTlPY3QiLCAiRGVsaXZlcnlfTW9kZV9kaWNob3RvbSIsICJNYXRlcm5hbF9QcmVwcmVnbmFuY3lCTUkxOG9jdDI4bmV3IiwgIkJpcnRoX1dlaWdodCIsIkJpcnRoX0xlbmd0aCIsICJIZWFkX0NpcmN1bWZlcmVuY2VfYXRfQmlydGgiLCJQYXJpdHlfZGljaG90b20iLCAgImluZHVjZWRsYWJvdXIiLCAibWF0ZXJuYWxfZGlhYmV0ZXNfZGljaG90b20iLCAibWF0ZXJuYWxfaHlwZXJ0ZW5zaW9uX2RpY2hvdG9tIiwgIk1hdGVybmFsX01lbnRhbF9EaXNvcmRlcnNfQnlfQ2hpbGRiaXJ0aCIpXQpgYGAKCmBgYHtyfQojIGZvciBzcGxpdCBieSBzZXgKIyB3aXRoIGFsY29ob2wKUmVnX0lucHV0X0RhdGFfUGxhY2VudGFfbWFsZV9QUkVET19FQUFSX3dhIDwtIERhdGFfUFJFRE9fUGxhY2VudGFfbWFsZVssIGMoIkVBQVJfTGVlIiwgIkNoaWxkX1NleCIsICJNYXRlcm5hbF9BZ2VfMThQb3BSZWdhbmRCUiIsICJzbW9raW5nX2RpY2hvdG9tIiwgIkFsY29ob2xfVXNlX0luX0Vhcmx5X1ByZWduYW5jeV8xOU9jdCIsICJEZWxpdmVyeV9Nb2RlX2RpY2hvdG9tIiwgIk1hdGVybmFsX1ByZXByZWduYW5jeUJNSTE4b2N0MjhuZXciLCAiQmlydGhfV2VpZ2h0IiwiQmlydGhfTGVuZ3RoIiwgIkhlYWRfQ2lyY3VtZmVyZW5jZV9hdF9CaXJ0aCIsIlBhcml0eV9kaWNob3RvbSIsICAiaW5kdWNlZGxhYm91ciIsICJtYXRlcm5hbF9kaWFiZXRlc19kaWNob3RvbSIsICJtYXRlcm5hbF9oeXBlcnRlbnNpb25fZGljaG90b20iLCAiTWF0ZXJuYWxfTWVudGFsX0Rpc29yZGVyc19CeV9DaGlsZGJpcnRoIildCgojIHdpdGhvdXQgYWxjb2hvbApSZWdfSW5wdXRfRGF0YV9QbGFjZW50YV9tYWxlX1BSRURPX0VBQVJfbiA8LSBEYXRhX1BSRURPX1BsYWNlbnRhX21hbGVbLCBjKCJFQUFSX0xlZSIsICJDaGlsZF9TZXgiLCAiTWF0ZXJuYWxfQWdlXzE4UG9wUmVnYW5kQlIiLCAic21va2luZ19kaWNob3RvbSIsICJEZWxpdmVyeV9Nb2RlX2RpY2hvdG9tIiwgIk1hdGVybmFsX1ByZXByZWduYW5jeUJNSTE4b2N0MjhuZXciLCAiQmlydGhfV2VpZ2h0IiwiQmlydGhfTGVuZ3RoIiwgIkhlYWRfQ2lyY3VtZmVyZW5jZV9hdF9CaXJ0aCIsIlBhcml0eV9kaWNob3RvbSIsICAiaW5kdWNlZGxhYm91ciIsICJtYXRlcm5hbF9kaWFiZXRlc19kaWNob3RvbSIsICJtYXRlcm5hbF9oeXBlcnRlbnNpb25fZGljaG90b20iLCAiTWF0ZXJuYWxfTWVudGFsX0Rpc29yZGVyc19CeV9DaGlsZGJpcnRoIildCgoKIyB3aXRoIGFsY29ob2wKUmVnX0lucHV0X0RhdGFfUGxhY2VudGFfZmVtYWxlX1BSRURPX0VBQVJfd2EgPC0gRGF0YV9QUkVET19QbGFjZW50YV9mZW1hbGVbLCBjKCJFQUFSX0xlZSIsICJDaGlsZF9TZXgiLCAiTWF0ZXJuYWxfQWdlXzE4UG9wUmVnYW5kQlIiLCAic21va2luZ19kaWNob3RvbSIsICJBbGNvaG9sX1VzZV9Jbl9FYXJseV9QcmVnbmFuY3lfMTlPY3QiLCAiRGVsaXZlcnlfTW9kZV9kaWNob3RvbSIsICJNYXRlcm5hbF9QcmVwcmVnbmFuY3lCTUkxOG9jdDI4bmV3IiwgIkJpcnRoX1dlaWdodCIsIkJpcnRoX0xlbmd0aCIsICJIZWFkX0NpcmN1bWZlcmVuY2VfYXRfQmlydGgiLCJQYXJpdHlfZGljaG90b20iLCAgImluZHVjZWRsYWJvdXIiLCAibWF0ZXJuYWxfZGlhYmV0ZXNfZGljaG90b20iLCAibWF0ZXJuYWxfaHlwZXJ0ZW5zaW9uX2RpY2hvdG9tIiwgIk1hdGVybmFsX01lbnRhbF9EaXNvcmRlcnNfQnlfQ2hpbGRiaXJ0aCIpXQoKIyB3aXRob3V0IGFsY29ob2wKUmVnX0lucHV0X0RhdGFfUGxhY2VudGFfZmVtYWxlX1BSRURPX0VBQVJfbiA8LSBEYXRhX1BSRURPX1BsYWNlbnRhX2ZlbWFsZVssIGMoIkVBQVJfTGVlIiwgIkNoaWxkX1NleCIsICJNYXRlcm5hbF9BZ2VfMThQb3BSZWdhbmRCUiIsICJzbW9raW5nX2RpY2hvdG9tIiwgIkRlbGl2ZXJ5X01vZGVfZGljaG90b20iLCAiTWF0ZXJuYWxfUHJlcHJlZ25hbmN5Qk1JMThvY3QyOG5ldyIsICJCaXJ0aF9XZWlnaHQiLCJCaXJ0aF9MZW5ndGgiLCAiSGVhZF9DaXJjdW1mZXJlbmNlX2F0X0JpcnRoIiwiUGFyaXR5X2RpY2hvdG9tIiwgICJpbmR1Y2VkbGFib3VyIiwgIm1hdGVybmFsX2RpYWJldGVzX2RpY2hvdG9tIiwgIm1hdGVybmFsX2h5cGVydGVuc2lvbl9kaWNob3RvbSIsICJNYXRlcm5hbF9NZW50YWxfRGlzb3JkZXJzX0J5X0NoaWxkYmlydGgiKV0KCmBgYAoKZGF0YSBmcmFtZSB3aXRob3V0IG1pc3NpbmdzCmBgYHtyfQpSZWdfSW5wdXRfRGF0YV9QbGFjZW50YV9QUkVET19FQUFSX25vTmFfbiA8LSBuYS5vbWl0KFJlZ19JbnB1dF9EYXRhX1BsYWNlbnRhX1BSRURPX0VBQVJfbikgCmRpbShSZWdfSW5wdXRfRGF0YV9QbGFjZW50YV9QUkVET19FQUFSX25vTmFfbikKClJlZ19JbnB1dF9EYXRhX1BsYWNlbnRhX1BSRURPX0VBQVJfbm9OYV93YSA8LSBuYS5vbWl0KFJlZ19JbnB1dF9EYXRhX1BsYWNlbnRhX1BSRURPX0VBQVJfd2EpIApkaW0oUmVnX0lucHV0X0RhdGFfUGxhY2VudGFfUFJFRE9fRUFBUl9ub05hX3dhKQoKClJlZ19JbnB1dF9EYXRhX1BsYWNlbnRhX21hbGVfUFJFRE9fRUFBUl9ub05hX24gPC0gbmEub21pdChSZWdfSW5wdXRfRGF0YV9QbGFjZW50YV9tYWxlX1BSRURPX0VBQVJfbikgCmRpbShSZWdfSW5wdXRfRGF0YV9QbGFjZW50YV9tYWxlX1BSRURPX0VBQVJfbm9OYV9uKQoKUmVnX0lucHV0X0RhdGFfUGxhY2VudGFfbWFsZV9QUkVET19FQUFSX25vTmFfd2EgPC0gbmEub21pdChSZWdfSW5wdXRfRGF0YV9QbGFjZW50YV9tYWxlX1BSRURPX0VBQVJfd2EpIApkaW0oUmVnX0lucHV0X0RhdGFfUGxhY2VudGFfbWFsZV9QUkVET19FQUFSX25vTmFfd2EpCgpSZWdfSW5wdXRfRGF0YV9QbGFjZW50YV9mZW1hbGVfUFJFRE9fRUFBUl9ub05hX24gPC0gbmEub21pdChSZWdfSW5wdXRfRGF0YV9QbGFjZW50YV9mZW1hbGVfUFJFRE9fRUFBUl9uKSAKZGltKFJlZ19JbnB1dF9EYXRhX1BsYWNlbnRhX2ZlbWFsZV9QUkVET19FQUFSX25vTmFfbikKClJlZ19JbnB1dF9EYXRhX1BsYWNlbnRhX2ZlbWFsZV9QUkVET19FQUFSX25vTmFfd2EgPC0gbmEub21pdChSZWdfSW5wdXRfRGF0YV9QbGFjZW50YV9mZW1hbGVfUFJFRE9fRUFBUl93YSkgCmRpbShSZWdfSW5wdXRfRGF0YV9QbGFjZW50YV9mZW1hbGVfUFJFRE9fRUFBUl9ub05hX3dhKQpgYGAKCgpgYGB7cn0Kc2tpbXI6OnNraW0oUmVnX0lucHV0X0RhdGFfUGxhY2VudGFfUFJFRE9fRUFBUl9ub05hX24pCmBgYAoKCmBgYHtyfQpzYXZlKFJlZ19JbnB1dF9EYXRhX1BsYWNlbnRhX1BSRURPX0VBQVJfbm9OYV93YSwgZmlsZT0iSW5wdXREYXRhL0Nsb2NrQ2FsY3VsYXRpb25zSW5wdXQvUmVnX0lucHV0X0RhdGFfUGxhY2VudGFfUFJFRE9fRUFBUl9ub05hX3dhLlJkYXRhIikKc2F2ZShSZWdfSW5wdXRfRGF0YV9QbGFjZW50YV9QUkVET19FQUFSX25vTmFfbiwgZmlsZT0iSW5wdXREYXRhL0Nsb2NrQ2FsY3VsYXRpb25zSW5wdXQvUmVnX0lucHV0X0RhdGFfUGxhY2VudGFfUFJFRE9fRUFBUl9ub05hX24uUmRhdGEiKQpgYGAKCmBgYHtyfQpzYXZlKFJlZ19JbnB1dF9EYXRhX1BsYWNlbnRhX21hbGVfUFJFRE9fRUFBUl9ub05hX3dhLCBmaWxlPSJJbnB1dERhdGEvQ2xvY2tDYWxjdWxhdGlvbnNJbnB1dC9SZWdfSW5wdXRfRGF0YV9QbGFjZW50YV9tYWxlX1BSRURPX0VBQVJfbm9OYV93YS5SZGF0YSIpCnNhdmUoUmVnX0lucHV0X0RhdGFfUGxhY2VudGFfbWFsZV9QUkVET19FQUFSX25vTmFfbiwgZmlsZT0iSW5wdXREYXRhL0Nsb2NrQ2FsY3VsYXRpb25zSW5wdXQvUmVnX0lucHV0X0RhdGFfUGxhY2VudGFfbWFsZV9QUkVET19FQUFSX25vTmFfbi5SZGF0YSIpCgpzYXZlKFJlZ19JbnB1dF9EYXRhX1BsYWNlbnRhX2ZlbWFsZV9QUkVET19FQUFSX25vTmFfd2EsIGZpbGU9IklucHV0RGF0YS9DbG9ja0NhbGN1bGF0aW9uc0lucHV0L1JlZ19JbnB1dF9EYXRhX1BsYWNlbnRhX2ZlbWFsZV9QUkVET19FQUFSX25vTmFfd2EuUmRhdGEiKQpzYXZlKFJlZ19JbnB1dF9EYXRhX1BsYWNlbnRhX2ZlbWFsZV9QUkVET19FQUFSX25vTmFfbiwgZmlsZT0iSW5wdXREYXRhL0Nsb2NrQ2FsY3VsYXRpb25zSW5wdXQvUmVnX0lucHV0X0RhdGFfUGxhY2VudGFfZmVtYWxlX1BSRURPX0VBQVJfbm9OYV9uLlJkYXRhIikKYGBgCgoKW3RvIHRoZSB0b3BdKCN0b3ApICAKCioqKgojIFNhbXBsZSB2aXN1YWxpemF0aW9uIHsjU2FtcGxlc30gIApGaWcuIDEKYGBge3J9ClZlbm5fSVRVIDwtIGV1bGVyKGMoIkNWUyI9MjY0LCAiUGxhY2VudGEgXG4oZmV0YWwgc2lkZSkiPTQ4NiwgIkNvcmQgYmxvb2QiPTQyNiwgIkNWUyZQbGFjZW50YSBcbihmZXRhbCBzaWRlKSI9ODYsICJQbGFjZW50YSBcbihmZXRhbCBzaWRlKSZDb3JkIGJsb29kIj0zOTAsICJDVlMmQ29yZCBibG9vZCI9NzMsICJDVlMmUGxhY2VudGEgXG4oZmV0YWwgc2lkZSkmQ29yZCBibG9vZCI9NjYpKQoKVmVubl9QUkVETyA8LSBldWxlcihjKCJQbGFjZW50YSBcbihkZWNpZHVhbCBcbnNpZGUpIj0xMzksICJDb3JkIFxuYmxvb2QgXG4oRVBJQykiPTE0OSwgIkNvcmQgYmxvb2QgKDQ1MEspIj03OTUsICJQbGFjZW50YSBcbihkZWNpZHVhbCBcbnNpZGUpJkNvcmQgXG5ibG9vZCBcbihFUElDKSI9MTE3KSkKCnBsb3QoVmVubl9JVFUsIGNvdW50cz1UUlVFLCBmb250PTEsIGNleD0yLCBhbHBoYT0wLjUsIGZpbGw9YygiZ3JleSIsICJsaWdodGdyZXkiLCAiZGFya2dyZXkiKSwgbGFiZWxzPUYpCmdyaWQ6OmdyaWQudGV4dCgiQ1ZTIFxubiA9IDI2NCIsIHg9MC4zLCB5PTAuMywgZ3A9Z3Bhcihjb2w9ImJsYWNrIiwgZm9udHNpemU9MTEsIGZvbnQ9IkFyaWFsIikpICNDVlMKZ3JpZDo6Z3JpZC50ZXh0KCJQbGFjZW50YSBcbihmZXRhbCBzaWRlKVxubiA9IDQ4NiIsIHg9MC42LCB5PTAuMiwgZ3A9Z3Bhcihjb2w9ImJsYWNrIiwgZm9udHNpemU9MTEsIGZvbnQ9IkFyaWFsIikpICNwbGFjZW50YQpncmlkOjpncmlkLnRleHQoIkNvcmQgYmxvb2Rcbm4gPSA0MjYiLCB4PTAuNSwgeT0wLjgsIGdwPWdwYXIoY29sPSJibGFjayIsIGZvbnRzaXplPTExLCBmb250PSJBcmlhbCIpKSAjY29yZApncmlkOjpncmlkLnRleHQoIjczIiwgeD0wLjM1LCB5PTAuNTUsIGdwPWdwYXIoY29sPSJibGFjayIsIGZvbnRzaXplPTEwLCBmb250PSJBcmlhbCIpKSAjY3ZzIGNvcmQKZ3JpZDo6Z3JpZC50ZXh0KCI4NiIsIHg9MC40MywgeT0wLjI2LCBncD1ncGFyKGNvbD0iYmxhY2siLCBmb250c2l6ZT0xMCwgZm9udD0iQXJpYWwiKSkgI2N2cyBwbGFjZW50YQpncmlkOjpncmlkLnRleHQoIjM5MCIsIHg9MC42LCB5PTAuNSwgZ3A9Z3Bhcihjb2w9ImJsYWNrIiwgZm9udHNpemU9MTAsIGZvbnQ9IkFyaWFsIikpICNjb3JkIHBsYWNlbnRhCmdyaWQ6OmdyaWQudGV4dCgiNjYiLCB4PTAuNDMsIHk9MC40NSwgZ3A9Z3Bhcihjb2w9ImJsYWNrIiwgZm9udHNpemU9MTAsIGZvbnQ9IkFyaWFsIikpICNhbGwKCnBsb3QoVmVubl9QUkVETywgY291bnRzPVRSVUUsIGZvbnQ9MSwgY2V4PTEsIGFscGhhPTAuNSwgZmlsbD1jKCJncmV5IiwgImxpZ2h0Z3JleSIsICJkYXJrZ3JleSIpLCBsYWJlbHM9RikKZ3JpZDo6Z3JpZC50ZXh0KCJQbGFjZW50YVxuKGRlY2lkdWFsIHNpZGUpIFxubiA9IDEzOSIsIHg9MC4wOCwgeT0wLjMsIGdwPWdwYXIoY29sPSJibGFjayIsIGZvbnRzaXplPTExLCBmb250PSJBcmlhbCIpKSAjIHBsYWNlbnRhCmdyaWQ6OmdyaWQudGV4dCgiQ29yZCBibG9vZFxuKEVQSUMpIFxubiA9IDE0OSIsIHg9MC4zNywgeT0wLjMsIGdwPWdwYXIoY29sPSJibGFjayIsIGZvbnRzaXplPTExLCBmb250PSJBcmlhbCIpKSAjIGNvcmQgZXBpYwpncmlkOjpncmlkLnRleHQoIkNvcmQgYmxvb2Rcbig0NTBLKSBcbm4gPSA3OTUiLCB4PTAuNzIsIHk9MC41LCBncD1ncGFyKGNvbD0iYmxhY2siLCBmb250c2l6ZT0xMSwgZm9udD0iQXJpYWwiKSkgIyBjb3JkIDQ1MGsKZ3JpZDo6Z3JpZC50ZXh0KCIxMTciLCB4PTAuMjMsIHk9MC4zLCBncD1ncGFyKGNvbD0iYmxhY2siLCBmb250c2l6ZT0xMCwgZm9udD0iQXJpYWwiKSkgIyBvdmVybGFwCmBgYApgYGB7cn0KaWZlbHNlKCFkaXIuZXhpc3RzKGZpbGUucGF0aChnZXR3ZCgpLCAiUmVzdWx0cy8iKSksIGRpci5jcmVhdGUoZmlsZS5wYXRoKGdldHdkKCksICJSZXN1bHRzLyIpKSwgRkFMU0UpCmBgYAoKYGBge3J9CmlmZWxzZSghZGlyLmV4aXN0cyhmaWxlLnBhdGgoZ2V0d2QoKSwgIlJlc3VsdHMvRmlndXJlcy8iKSksIGRpci5jcmVhdGUoZmlsZS5wYXRoKGdldHdkKCksICJSZXN1bHRzL0ZpZ3VyZXMvIikpLCBGQUxTRSkKYGBgCgpgYGB7ciwgd2FybmluZz1GfQpwbmcoZmlsZW5hbWU9IlJlc3VsdHMvRmlndXJlcy9JVFVfc2FtcGxlLnBuZyIsIHdpZHRoPTIzMDAsIGhlaWdodD0xNTAwLCByZXM9MzAwKQpwbG90KFZlbm5fSVRVLCBjb3VudHM9VFJVRSwgZm9udD0xLCBjZXg9MiwgYWxwaGE9MC41LCBmaWxsPWMoImdyZXkiLCAibGlnaHRncmV5IiwgImRhcmtncmV5IiksIGxhYmVscz1GKQpncmlkOjpncmlkLnRleHQoIkNWUyBcbm4gPSAyNjQiLCB4PTAuMywgeT0wLjMsIGdwPWdwYXIoY29sPSJibGFjayIsIGZvbnRzaXplPTExLCBmb250PSJBcmlhbCIpKSAjQ1ZTCmdyaWQ6OmdyaWQudGV4dCgiUGxhY2VudGEgXG4oZmV0YWwgc2lkZSlcbm4gPSA0ODYiLCB4PTAuNiwgeT0wLjIsIGdwPWdwYXIoY29sPSJibGFjayIsIGZvbnRzaXplPTExLCBmb250PSJBcmlhbCIpKSAjcGxhY2VudGEKZ3JpZDo6Z3JpZC50ZXh0KCJDb3JkIGJsb29kXG5uID0gNDI2IiwgeD0wLjUsIHk9MC44LCBncD1ncGFyKGNvbD0iYmxhY2siLCBmb250c2l6ZT0xMSwgZm9udD0iQXJpYWwiKSkgI2NvcmQKZ3JpZDo6Z3JpZC50ZXh0KCI3MyIsIHg9MC4zNSwgeT0wLjU1LCBncD1ncGFyKGNvbD0iYmxhY2siLCBmb250c2l6ZT0xMCwgZm9udD0iQXJpYWwiKSkgI2N2cyBjb3JkCmdyaWQ6OmdyaWQudGV4dCgiODYiLCB4PTAuNDMsIHk9MC4yNiwgZ3A9Z3Bhcihjb2w9ImJsYWNrIiwgZm9udHNpemU9MTAsIGZvbnQ9IkFyaWFsIikpICNjdnMgcGxhY2VudGEKZ3JpZDo6Z3JpZC50ZXh0KCIzOTAiLCB4PTAuNiwgeT0wLjUsIGdwPWdwYXIoY29sPSJibGFjayIsIGZvbnRzaXplPTEwLCBmb250PSJBcmlhbCIpKSAjY29yZCBwbGFjZW50YQpncmlkOjpncmlkLnRleHQoIjY2IiwgeD0wLjQzLCB5PTAuNDUsIGdwPWdwYXIoY29sPSJibGFjayIsIGZvbnRzaXplPTEwLCBmb250PSJBcmlhbCIpKSAjYWxsCmRldi5vZmYoKQpgYGAKCmBgYHtyLCB3YXJuaW5nPUZ9CnBuZyhmaWxlbmFtZT0iUmVzdWx0cy9GaWd1cmVzL1BSRURPX3NhbXBsZS5wbmciLCB3aWR0aD0yMzAwLCBoZWlnaHQ9MTUwMCwgcmVzPTMwMCkKcGxvdChWZW5uX1BSRURPLCBjb3VudHM9VFJVRSwgZm9udD0xLCBjZXg9MSwgYWxwaGE9MC41LCBmaWxsPWMoImdyZXkiLCAibGlnaHRncmV5IiwgImRhcmtncmV5IiksIGxhYmVscz1GKQpncmlkOjpncmlkLnRleHQoIlBsYWNlbnRhXG4oZGVjaWR1YWwgc2lkZSkgXG5uID0gMTM5IiwgeD0wLjA4LCB5PTAuMywgZ3A9Z3Bhcihjb2w9ImJsYWNrIiwgZm9udHNpemU9MTEsIGZvbnQ9IkFyaWFsIikpICMgcGxhY2VudGEKZ3JpZDo6Z3JpZC50ZXh0KCJDb3JkIGJsb29kXG4oRVBJQykgXG5uID0gMTQ5IiwgeD0wLjM3LCB5PTAuMywgZ3A9Z3Bhcihjb2w9ImJsYWNrIiwgZm9udHNpemU9MTEsIGZvbnQ9IkFyaWFsIikpICMgY29yZCBlcGljCmdyaWQ6OmdyaWQudGV4dCgiQ29yZCBibG9vZFxuKDQ1MEspIFxubiA9IDc5NSIsIHg9MC43MiwgeT0wLjUsIGdwPWdwYXIoY29sPSJibGFjayIsIGZvbnRzaXplPTExLCBmb250PSJBcmlhbCIpKSAjIGNvcmQgNDUwawpncmlkOjpncmlkLnRleHQoIjExNyIsIHg9MC4yMywgeT0wLjMsIGdwPWdwYXIoY29sPSJibGFjayIsIGZvbnRzaXplPTEwLCBmb250PSJBcmlhbCIpKSAjIG92ZXJsYXAKZGV2Lm9mZigpCmBgYAoKCiMgSVRVIERlc2NyaXB0aXZlcyB7I0lUVURlc2NyaXB0aXZlfSAgCgoqVGFibGUgMSAmIDIqCgpgYGB7cn0KaWZlbHNlKCFkaXIuZXhpc3RzKGZpbGUucGF0aChnZXR3ZCgpLCAiUmVzdWx0cy9GaWd1cmVzL2RpZmZUaXNzdWVzIikpLCBkaXIuY3JlYXRlKGZpbGUucGF0aChnZXR3ZCgpLCAiUmVzdWx0cy9GaWd1cmVzL2RpZmZUaXNzdWVzIikpLCBGQUxTRSkKYGBgCgojIyBJVFUgQ1ZTCkNsb2NrCmBgYHtyfQprbml0cjo6a2FibGUoCiAgcHN5Y2g6OmRlc2NyaWJlKERhdGFfQ1ZTX0lUVVsgLGMoIkdlc3RhdGlvbmFsX0FnZV9XZWVrcyIsICJnZXN0YWdlX2F0X0NWU193ZWVrcyIsIkROQW1HQV9MZWUiLCJkZWx0YV9MZWUiLCJ6ZGVsdGFfTGVlIiwgIkVBQVJfTGVlIiwgIkROQW1HQV9NYXluZSIsImRlbHRhX01heW5lIiwiemRlbHRhX01heW5lIiwiRUFBUl9NYXluZSIpXSkKKQpgYGAKCkNlbGwgdHlwZXMKYGBge3J9CmtuaXRyOjprYWJsZSgKICBwc3ljaDo6ZGVzY3JpYmUoRGF0YV9DVlNfSVRVWyAsYygiVHJvcGhvYmxhc3RzIiwgIlN0cm9tYWwiLCAiSG9mYmF1ZXIiLCAiRW5kb3RoZWxpYWwiLCAiblJCQyIsICJTeW5jeXRpb3Ryb3Bob2JsYXN0IildKQopCgpEYXRhX2NlbGxzX2N2c19pdHUgPC0gRGF0YV9DVlNfSVRVWyAsYygiVHJvcGhvYmxhc3RzIiwgIlN0cm9tYWwiLCAiSG9mYmF1ZXIiLCAiRW5kb3RoZWxpYWwiLCAiblJCQyIsICJTeW5jeXRpb3Ryb3Bob2JsYXN0IildCgpjZWxsc19jdnMgPC0gZGF0YS5mcmFtZShwc3ljaDo6ZGVzY3JpYmUoRGF0YV9DVlNfSVRVWyAsYygiVHJvcGhvYmxhc3RzIiwgIlN0cm9tYWwiLCAiSG9mYmF1ZXIiLCAiRW5kb3RoZWxpYWwiLCAiblJCQyIsICJTeW5jeXRpb3Ryb3Bob2JsYXN0IildKSkKY2VsbHNfY3ZzXyA8LSBjZWxsc19jdnNbICxjKCJtZWFuIiwgInNkIildCgpwbG90X2NlbGxzX2N2cyA8LSBnZ3Bsb3QoY2VsbHNfY3ZzLCBhZXMoeD1hcy5mYWN0b3Iocm93bmFtZXMoY2VsbHNfY3ZzKSksIHk9bWVhbikpICsKICBnZW9tX2Jhcihwb3NpdGlvbj1wb3NpdGlvbl9kb2RnZSgpLCBzdGF0PSJpZGVudGl0eSIsIGNvbG91cj0nYmxhY2snKSArCiAgZ2VvbV9lcnJvcmJhcihhZXMoeW1pbj1tZWFuLXNkLCB5bWF4PW1lYW4rc2QpLCB3aWR0aD0uMixwb3NpdGlvbj1wb3NpdGlvbl9kb2RnZSguOSkpKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTAsIHZqdXN0ID0gMC41LCBoanVzdD0xKSkrCiAgbGFicyh4ID0iXG5DVlMgKElUVSkiKQoKcG5nKGZpbGVuYW1lPSJSZXN1bHRzL0ZpZ3VyZXMvZGlmZlRpc3N1ZXMvY3ZzX2NlbGxzX2l0dS5wbmciLCB3aWR0aD0yMzAwLCBoZWlnaHQ9MTUwMCwgcmVzPTQwMCkKcGxvdF9jZWxsc19jdnMKZGV2Lm9mZigpCmBgYAoKcHJlZGljdG9ycyBkZXNjcmlwdGl2ZQpgYGB7cn0KQ1ZTX1ByZWRzX0lUVSA8LSBEYXRhX0NWU19JVFVbLGMoIkNoaWxkX1NleCIsICJEZWxpdmVyeV9tb2RlX2RpY2hvdG9tIiwgIkluZHVjZWRfTGFib3VyIiwgIlBhcml0eV9kaWNob3RvbSIsICJNYXRlcm5hbF9IeXBlcnRlbnNpb25fZGljaG90b20iLCAiTWF0ZXJuYWxfRGlhYmV0ZXNfZGljaG90b20iLCAiTWF0ZXJuYWxfTWVudGFsX0Rpc29yZGVycyIsICJzbW9raW5nX2RpY2hvdG9tIiwgIm1hdGVybmFsX2FsY29ob2xfdXNlIiwgIk1hdGVybmFsX0FnZV9ZZWFycyIsICJNYXRlcm5hbF9Cb2R5X01hc3NfSW5kZXhfaW5fRWFybHlfUHJlZ25hbmN5IiwgIkNoaWxkX0JpcnRoX1dlaWdodCIsICJDaGlsZF9CaXJ0aF9MZW5ndGgiLCAiQ2hpbGRfSGVhZF9DaXJjdW1mZXJlbmNlX0F0X0JpcnRoIildCmNvbG5hbWVzKENWU19QcmVkc19JVFUpIDwtIGMoImNoaWxkX3NleCIsICJkZWxpdmVyeV9tb2RlIiwgImluZHVjZWRfbGFib3IiLCAicGFyaXR5IiwgImh5cGVydGVuc2lvbiIsICJkaWFiZXRlcyIsICJtZW50YWxfZGlzb3JkZXJzIiwgInNtb2tpbmciLCAiYWxjb2hvbCIsICJtYXRlcm5hbF9hZ2UiLCAibWF0ZXJuYWxfQk1JIiwgImJpcnRoX3dlaWdodCIsICJiaXJ0aF9sZW5ndGgiLCAiaGVhZF9jaXJjdW1mZXJlbmNlIikKQ1ZTX1ByZWRzX0lUVSRncm91cCA8LSAiSVRVIgpgYGAKCmBgYHtyfQpDVlNfUHJlZHNfSVRVICU+JSAgCnNlbGVjdF9pZihpcy5mYWN0b3IpICU+JSAKSG1pc2M6OmRlc2NyaWJlKCkKYGBgCgpgYGB7cn0KQ1ZTX1ByZWRzX0lUVSAlPiUKc2VsZWN0X2lmKGlzLm51bWVyaWMpICU+JSAKcHN5Y2g6OmRlc2NyaWJlKCkKYGBgCgotIG1vZGVsIHdpdGhvdXQgYWxjb2hvbAoKPCEtLSBgYGB7cn0gLS0+CjwhLS0gbG9hZCgiSW5wdXREYXRhL0Nsb2NrQ2FsY3VsYXRpb25zSW5wdXQvUmVnX0lucHV0X0RhdGFfQ1ZTX0lUVV9FQUFSX25fbm9OYS5SZGF0YSIpIC0tPgo8IS0tIGBgYCAtLT4KCmBgYHtyfQpSZWdfSW5wdXRfRGF0YV9DVlNfSVRVX0VBQVJfbl9ub05hICU+JQogIHNlbGVjdF9pZihpcy5mYWN0b3IpICU+JQogIEhtaXNjOjpkZXNjcmliZSgpCgpSZWdfSW5wdXRfRGF0YV9DVlNfSVRVX0VBQVJfbl9ub05hICU+JQogIHNlbGVjdF9pZihpcy5udW1lcmljKSAlPiUKICBIbWlzYzo6ZGVzY3JpYmUoKQpgYGAKCi0gbW9kZWwgd2l0aCBhbGNvaG9sCjwhLS0gd2l0aCBhbGNvaG9sIC0tPgo8IS0tIGBgYHtyfSAtLT4KPCEtLSBsb2FkKCJJbnB1dERhdGEvQ2xvY2tDYWxjdWxhdGlvbnNJbnB1dC9SZWdfSW5wdXRfRGF0YV9DVlNfSVRVX0VBQVJfd2Ffbm9OYS5SZGF0YSIpIC0tPgo8IS0tIGBgYCAtLT4KCmBgYHtyfQpSZWdfSW5wdXRfRGF0YV9DVlNfSVRVX0VBQVJfd2Ffbm9OYSAlPiUKICBzZWxlY3RfaWYoaXMuZmFjdG9yKSAlPiUKICBIbWlzYzo6ZGVzY3JpYmUoKQoKI2FsY29ob2wgdXNlIDE0LjMlCmBgYAoKYGBge3J9ClJlZ19JbnB1dF9EYXRhX0NWU19JVFVfRUFBUl93YV9ub05hICU+JQogIHNlbGVjdF9pZihpcy5udW1lcmljKSAlPiUKICBIbWlzYzo6ZGVzY3JpYmUoKQpgYGAKCgojIyBJVFUgQ29yZCBibG9vZApDbG9ja3MKYGBge3IsIHdhcm5pbmc9RkFMU0V9CmtuaXRyOjprYWJsZSgKcHN5Y2g6OmRlc2NyaWJlKERhdGFfQ29yZF9JVFVbICxjKCJHZXN0YXRpb25hbF9BZ2VfV2Vla3MiLCJETkFtR0FfS25pZ2h0IiwiZGVsdGFfS25pZ2h0IiwiemRlbHRhX0tuaWdodCIsICJFQUFSX0tuaWdodCIsICJETkFtR0FfQm9obGluIiwiZGVsdGFfQm9obGluIiwiemRlbHRhX0JvaGxpbiIsICJFQUFSX0JvaGxpbiIpXSkKKQpgYGAKCmNlbGwgdHlwZXMKYGBge3J9CmtuaXRyOjprYWJsZSgKICBwc3ljaDo6ZGVzY3JpYmUoRGF0YV9Db3JkX0lUVVsgLGMoIkNEOFQiLCAiQ0Q0VCIsICJOSyIsICJCY2VsbCIsICJNb25vIiwgIkdyYW4iLCAiblJCQyIpXSkKKQoKRGF0YV9jZWxsc19jb3JkIDwtIERhdGFfQ29yZF9JVFVbICxjKCJTYW1wbGVfTmFtZSIsICJDRDhUIiwgIkNENFQiLCAiTksiLCAiQmNlbGwiLCAiTW9ubyIsICJHcmFuIiwgIm5SQkMiKV0KCmNlbGxzX2NvcmQgPC0gZGF0YS5mcmFtZShwc3ljaDo6ZGVzY3JpYmUoRGF0YV9Db3JkX0lUVVsgLGMoIkNEOFQiLCAiQ0Q0VCIsICJOSyIsICJCY2VsbCIsICJNb25vIiwgIkdyYW4iLCAiblJCQyIpXSkpCmNlbGxzX2NvcmQgPC0gY2VsbHNfY29yZFsgLGMoIm1lYW4iLCAic2QiKV0Kcm93bmFtZXMoY2VsbHNfY29yZCkgPC0gYygiQ0Q4VCIsICJDRDQ2IiwgIk5LIiwgIkJjZWxsIiwgIk1vbm9jeXRlcyIsICJHcmFudWxvY3l0ZXMiLCAiblJCQyIpCgpwbG90X2NlbGxzX2NvcmQgPC0gZ2dwbG90KGNlbGxzX2NvcmQsIGFlcyh4PWFzLmZhY3Rvcihyb3duYW1lcyhjZWxsc19jb3JkKSksIHk9bWVhbikpICsKICBnZW9tX2Jhcihwb3NpdGlvbj1wb3NpdGlvbl9kb2RnZSgpLCBzdGF0PSJpZGVudGl0eSIsIGNvbG91cj0nYmxhY2snKSArCiAgZ2VvbV9lcnJvcmJhcihhZXMoeW1pbj1tZWFuLXNkLCB5bWF4PW1lYW4rc2QpLCB3aWR0aD0uMixwb3NpdGlvbj1wb3NpdGlvbl9kb2RnZSguOSkpKwogIGxhYnMoeCA9IlxuQ29yZCBibG9vZCAoSVRVKSIpKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTAsIHZqdXN0ID0gMC41LCBoanVzdD0xKSkKCnBuZyhmaWxlbmFtZT0iUmVzdWx0cy9GaWd1cmVzL2RpZmZUaXNzdWVzL2NvcmRfY2VsbHNfaXR1LnBuZyIsIHdpZHRoPTIzMDAsIGhlaWdodD0xNTAwLCByZXM9NDAwKQpwbG90X2NlbGxzX2NvcmQKZGV2Lm9mZigpCgpgYGAKCnByZWRpY3RvcnMgZGVzY3JpcHRpdmUKYGBge3J9CkNvcmRibG9vZF9QcmVkc19JVFUgPC0gRGF0YV9Db3JkX0lUVVssYygiQ2hpbGRfU2V4IiwgIkRlbGl2ZXJ5X21vZGVfZGljaG90b20iLCAiSW5kdWNlZF9MYWJvdXIiLCAiUGFyaXR5X2RpY2hvdG9tIiwgIk1hdGVybmFsX0h5cGVydGVuc2lvbl9kaWNob3RvbSIsICJNYXRlcm5hbF9EaWFiZXRlc19kaWNob3RvbSIsICJNYXRlcm5hbF9NZW50YWxfRGlzb3JkZXJzIiwgInNtb2tpbmdfZGljaG90b20iLCAibWF0ZXJuYWxfYWxjb2hvbF91c2UiLCAiTWF0ZXJuYWxfQWdlX1llYXJzIiwgIk1hdGVybmFsX0JvZHlfTWFzc19JbmRleF9pbl9FYXJseV9QcmVnbmFuY3kiLCAiQ2hpbGRfQmlydGhfV2VpZ2h0IiwgIkNoaWxkX0JpcnRoX0xlbmd0aCIsICJDaGlsZF9IZWFkX0NpcmN1bWZlcmVuY2VfQXRfQmlydGgiKV0KY29sbmFtZXMoQ29yZGJsb29kX1ByZWRzX0lUVSkgPC0gYygiY2hpbGRfc2V4IiwgImRlbGl2ZXJ5X21vZGUiLCAiaW5kdWNlZF9sYWJvciIsICJwYXJpdHkiLCAiaHlwZXJ0ZW5zaW9uIiwgImRpYWJldGVzIiwgIm1lbnRhbF9kaXNvcmRlcnMiLCAic21va2luZyIsICJhbGNvaG9sIiwgIm1hdGVybmFsX2FnZSIsICJtYXRlcm5hbF9CTUkiLCAiYmlydGhfd2VpZ2h0IiwgImJpcnRoX2xlbmd0aCIsICJoZWFkX2NpcmN1bWZlcmVuY2UiKQpDb3JkYmxvb2RfUHJlZHNfSVRVJGdyb3VwIDwtICJJVFUiCmBgYAoKYGBge3J9CkNvcmRibG9vZF9QcmVkc19JVFUgJT4lICAKc2VsZWN0X2lmKGlzLmZhY3RvcikgJT4lIApIbWlzYzo6ZGVzY3JpYmUoKQpgYGAKCmBgYHtyfQpDb3JkYmxvb2RfUHJlZHNfSVRVICU+JSAgCnNlbGVjdF9pZihpcy5udW1lcmljKSAlPiUgCkhtaXNjOjpkZXNjcmliZSgpCmBgYAoKLSBtb2RlbCB3aXRob3V0IGFsY29ob2wKCjwhLS0gYGBge3J9IC0tPgo8IS0tIGxvYWQoIklucHV0RGF0YS9DbG9ja0NhbGN1bGF0aW9uc0lucHV0L1JlZ19JbnB1dF9EYXRhX0NvcmRfSVRVX0VBQVJfbm9OYV9uLlJkYXRhIikgLS0+CjwhLS0gYGBgIC0tPgoKYGBge3J9ClJlZ19JbnB1dF9EYXRhX0NvcmRfSVRVX0VBQVJfbm9OYV9uICU+JQogIHNlbGVjdF9pZihpcy5mYWN0b3IpICU+JQogIEhtaXNjOjpkZXNjcmliZSgpCgpSZWdfSW5wdXRfRGF0YV9Db3JkX0lUVV9FQUFSX25vTmFfbiAlPiUKICBzZWxlY3RfaWYoaXMubnVtZXJpYykgJT4lCiAgSG1pc2M6OmRlc2NyaWJlKCkKYGBgCgotIG1vZGVsIHdpdGggYWxjb2hvbAoKPCEtLSBgYGB7cn0gLS0+CjwhLS0gbG9hZCgiSW5wdXREYXRhL0Nsb2NrQ2FsY3VsYXRpb25zSW5wdXQvUmVnX0lucHV0X0RhdGFfQ29yZF9JVFVfRUFBUl9ub05hX3dhLlJkYXRhIikgLS0+CjwhLS0gYGBgIC0tPgoKYGBge3J9ClJlZ19JbnB1dF9EYXRhX0NvcmRfSVRVX0VBQVJfbm9OYV93YSAlPiUKICBzZWxlY3RfaWYoaXMuZmFjdG9yKSAlPiUKICBIbWlzYzo6ZGVzY3JpYmUoKQoKUmVnX0lucHV0X0RhdGFfQ29yZF9JVFVfRUFBUl9ub05hX3dhICU+JQogIHNlbGVjdF9pZihpcy5udW1lcmljKSAlPiUKICBIbWlzYzo6ZGVzY3JpYmUoKQoKIzEwLjQlIG1hdGVybmFsIGFsY29ob2wgdXNlCmBgYAoKIyMgSVRVIFBsYWNlbnRhCkNsb2NrcwpgYGB7ciwgd2FybmluZz1GQUxTRX0Ka25pdHI6OmthYmxlKApwc3ljaDo6ZGVzY3JpYmUoRGF0YV9QbGFjZW50YV9JVFVbICxjKCJHZXN0YXRpb25hbF9BZ2VfV2Vla3MiLCJETkFtR0FfTGVlIiwiZGVsdGFfTGVlIiwiemRlbHRhX0xlZSIsICJFQUFSX0xlZSIsICJETkFtR0FfTWF5bmUiLCJkZWx0YV9NYXluZSIsInpkZWx0YV9NYXluZSIsIkVBQVJfTWF5bmUiLCAiVGltZURpZmZlcmVuY2VQbGFjZW50YV9iaXJ0aF9zYW1wbGluZyIpXSkKKQpgYGAKCmNlbGwgdHlwZXMKYGBge3J9CmtuaXRyOjprYWJsZSgKICBwc3ljaDo6ZGVzY3JpYmUoRGF0YV9QbGFjZW50YV9JVFVbICxjKCJUcm9waG9ibGFzdHMiLCAiU3Ryb21hbCIsICJIb2ZiYXVlciIsICJFbmRvdGhlbGlhbCIsICJuUkJDIiwgIlN5bmN5dGlvdHJvcGhvYmxhc3QiKV0pCikKCkRhdGFfY2VsbHNfcGxhY2VudGFfaXR1IDwtIERhdGFfUGxhY2VudGFfSVRVWyAsYygiVHJvcGhvYmxhc3RzIiwgIlN0cm9tYWwiLCAiSG9mYmF1ZXIiLCAiRW5kb3RoZWxpYWwiLCAiblJCQyIsICJTeW5jeXRpb3Ryb3Bob2JsYXN0IildCgpjZWxsc19wbGFjZW50YSA8LSBkYXRhLmZyYW1lKHBzeWNoOjpkZXNjcmliZShEYXRhX1BsYWNlbnRhX0lUVVsgLGMoIlRyb3Bob2JsYXN0cyIsICJTdHJvbWFsIiwgIkhvZmJhdWVyIiwgIkVuZG90aGVsaWFsIiwgIm5SQkMiLCAiU3luY3l0aW90cm9waG9ibGFzdCIpXSkpCmNlbGxzX3BsYWNlbnRhIDwtIGNlbGxzX3BsYWNlbnRhWyAsYygibWVhbiIsICJzZCIpXQoKcGxvdF9jZWxsc19wbGFjZW50YSA8LSBnZ3Bsb3QoY2VsbHNfcGxhY2VudGEsIGFlcyh4PWFzLmZhY3Rvcihyb3duYW1lcyhjZWxsc19wbGFjZW50YSkpLCB5PW1lYW4pKSArCiAgZ2VvbV9iYXIocG9zaXRpb249cG9zaXRpb25fZG9kZ2UoKSwgc3RhdD0iaWRlbnRpdHkiLCBjb2xvdXI9J2JsYWNrJykgKwogIGdlb21fZXJyb3JiYXIoYWVzKHltaW49bWVhbi1zZCwgeW1heD1tZWFuK3NkKSwgd2lkdGg9LjIscG9zaXRpb249cG9zaXRpb25fZG9kZ2UoLjkpKSsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwLCB2anVzdCA9IDAuNSwgaGp1c3Q9MSkpKwogIGxhYnMoeCA9IlxuZmV0YWwgUGxhY2VudGEgKElUVSkiKQoKcG5nKGZpbGVuYW1lPSJSZXN1bHRzL0ZpZ3VyZXMvZGlmZlRpc3N1ZXMvcGxhY2VudGFfY2VsbHNfaXR1LnBuZyIsIHdpZHRoPTIzMDAsIGhlaWdodD0xNTAwLCByZXM9NDAwKQpwbG90X2NlbGxzX3BsYWNlbnRhCmRldi5vZmYoKQpwbG90X2NlbGxzX3BsYWNlbnRhCmBgYAoKcHJlZGljdG9ycyBkZXNjcmlwdGl2ZQpgYGB7cn0KUGxhY2VudGFfUHJlZHNfSVRVIDwtIERhdGFfUGxhY2VudGFfSVRVWyxjKCJDaGlsZF9TZXgiLCAiRGVsaXZlcnlfbW9kZV9kaWNob3RvbSIsICJJbmR1Y2VkX0xhYm91ciIsICJQYXJpdHlfZGljaG90b20iLCAiTWF0ZXJuYWxfSHlwZXJ0ZW5zaW9uX2RpY2hvdG9tIiwgIk1hdGVybmFsX0RpYWJldGVzX2RpY2hvdG9tIiwgIk1hdGVybmFsX01lbnRhbF9EaXNvcmRlcnMiLCAic21va2luZ19kaWNob3RvbSIsICJtYXRlcm5hbF9hbGNvaG9sX3VzZSIsICJNYXRlcm5hbF9BZ2VfWWVhcnMiLCAiTWF0ZXJuYWxfQm9keV9NYXNzX0luZGV4X2luX0Vhcmx5X1ByZWduYW5jeSIsICJDaGlsZF9CaXJ0aF9XZWlnaHQiLCAiQ2hpbGRfQmlydGhfTGVuZ3RoIiwgIkNoaWxkX0hlYWRfQ2lyY3VtZmVyZW5jZV9BdF9CaXJ0aCIpXQpjb2xuYW1lcyhQbGFjZW50YV9QcmVkc19JVFUpIDwtIGMoImNoaWxkX3NleCIsICJkZWxpdmVyeV9tb2RlIiwgImluZHVjZWRfbGFib3IiLCAicGFyaXR5IiwgImh5cGVydGVuc2lvbiIsICJkaWFiZXRlcyIsICJtZW50YWxfZGlzb3JkZXJzIiwgInNtb2tpbmciLCAiYWxjb2hvbCIsICJtYXRlcm5hbF9hZ2UiLCAibWF0ZXJuYWxfQk1JIiwgImJpcnRoX3dlaWdodCIsICJiaXJ0aF9sZW5ndGgiLCAiaGVhZF9jaXJjdW1mZXJlbmNlIikKUGxhY2VudGFfUHJlZHNfSVRVJGdyb3VwIDwtICJJVFUiCmBgYAoKYGBge3J9ClBsYWNlbnRhX1ByZWRzX0lUVSAlPiUgIApzZWxlY3RfaWYoaXMuZmFjdG9yKSAlPiUgCkhtaXNjOjpkZXNjcmliZSgpCmBgYAoKYGBge3J9ClBsYWNlbnRhX1ByZWRzX0lUVSAlPiUgIApzZWxlY3RfaWYoaXMubnVtZXJpYykgJT4lIApIbWlzYzo6ZGVzY3JpYmUoKQpgYGAKCi0gbW9kZWwgd2l0aG91dCBhbGNvaG9sCgo8IS0tIGBgYHtyfSAtLT4KPCEtLSBsb2FkKCJJbnB1dERhdGEvQ2xvY2tDYWxjdWxhdGlvbnNJbnB1dC9SZWdfSW5wdXRfRGF0YV9QbGFjZW50YV9JVFVfRUFBUl9ub05hX24uUmRhdGEiKSAtLT4KPCEtLSBgYGAgLS0+CgpgYGB7cn0KUmVnX0lucHV0X0RhdGFfUGxhY2VudGFfSVRVX0VBQVJfbm9OYV9uICU+JQogIHNlbGVjdF9pZihpcy5mYWN0b3IpICU+JQogIEhtaXNjOjpkZXNjcmliZSgpCgpSZWdfSW5wdXRfRGF0YV9QbGFjZW50YV9JVFVfRUFBUl9ub05hX24gJT4lCiAgc2VsZWN0X2lmKGlzLm51bWVyaWMpICU+JQogIEhtaXNjOjpkZXNjcmliZSgpCmBgYAoKLSBtb2RlbCB3aXRoIGFsY29ob2wKCjwhLS0gYGBge3J9IC0tPgo8IS0tIGxvYWQoIklucHV0RGF0YS9DbG9ja0NhbGN1bGF0aW9uc0lucHV0L1JlZ19JbnB1dF9EYXRhX1BsYWNlbnRhX0lUVV9FQUFSX25vTmFfd2EuUmRhdGEiKSAtLT4KPCEtLSBgYGAgLS0+CgpgYGB7cn0KUmVnX0lucHV0X0RhdGFfUGxhY2VudGFfSVRVX0VBQVJfbm9OYV93YSAlPiUKICBzZWxlY3RfaWYoaXMuZmFjdG9yKSAlPiUKICBIbWlzYzo6ZGVzY3JpYmUoKQoKUmVnX0lucHV0X0RhdGFfUGxhY2VudGFfSVRVX0VBQVJfbm9OYV93YSAlPiUKICBzZWxlY3RfaWYoaXMubnVtZXJpYykgJT4lCiAgSG1pc2M6OmRlc2NyaWJlKCkKCiMgYWxjb2hvbCB1c2UgMTAuMiUKYGBgCgoKW3RvIHRoZSB0b3BdKCN0b3ApIAoKCiMgUFJFRE8gRGVzY3JpcHRpdmVzIHsjUFJFRE9EZXNjcmlwdGl2ZX0gIAoKIyMgQ29yZCBibG9vZCBFUElDCkNsb2NrcwpgYGB7ciwgd2FybmluZz1GQUxTRX0Ka25pdHI6OmthYmxlKAogIHBzeWNoOjpkZXNjcmliZShEYXRhX1BSRURPX0VQSUNjb3JkWyxjKCJHZXN0YXRpb25hbF9BZ2UiLCJETkFtR0FfS25pZ2h0IiwiZGVsdGFfS25pZ2h0IiwiemRlbHRhX0tuaWdodCIsICJFQUFSX0tuaWdodCIsIkROQW1HQV9Cb2hsaW4iLCJkZWx0YV9Cb2hsaW4iLCJ6ZGVsdGFfQm9obGluIiwgICJFQUFSX0JvaGxpbiIpXSkKKQpgYGAKCmNlbGwgdHlwZXMKYGBge3J9CmtuaXRyOjprYWJsZSgKICBwc3ljaDo6ZGVzY3JpYmUoRGF0YV9QUkVET19FUElDY29yZFsgLGMoIkNEOFQiLCAiQ0Q0VCIsICJOSyIsICJCY2VsbCIsICJNb25vIiwgIkdyYW4iLCAiblJCQyIpXSkKKQoKRGF0YV9jZWxsc19jb3JkX2VwaWMgPC0gRGF0YV9QUkVET19FUElDY29yZFsgLGMoIlNhbXBsZV9OYW1lIiwgIkNEOFQiLCAiQ0Q0VCIsICJOSyIsICJCY2VsbCIsICJNb25vIiwgIkdyYW4iLCAiblJCQyIpXQogIAoKY2VsbHNfY29yZF9lcGljIDwtIGRhdGEuZnJhbWUocHN5Y2g6OmRlc2NyaWJlKERhdGFfUFJFRE9fRVBJQ2NvcmRbICxjKCJDRDhUIiwgIkNENFQiLCAiTksiLCAiQmNlbGwiLCAiTW9ubyIsICJHcmFuIiwgIm5SQkMiKV0pKQpjZWxsc19jb3JkX2VwaWMgPC0gY2VsbHNfY29yZF9lcGljWyAsYygibWVhbiIsICJzZCIpXQpyb3duYW1lcyhjZWxsc19jb3JkX2VwaWMpIDwtIGMoIkNEOFQiLCAiQ0Q0VCIsICJOSyIsICJCY2VsbCIsICJNb25vY3l0ZXMiLCAiR3JhbnVsb2N5dGVzIiwgIm5SQkMiKQogIAoKcGxvdF9jZWxsc19jb3JkX2VwaWMgPC0gZ2dwbG90KGNlbGxzX2NvcmRfZXBpYywgYWVzKHg9YXMuZmFjdG9yKHJvd25hbWVzKGNlbGxzX2NvcmRfZXBpYykpLCB5PW1lYW4pKSArCiAgZ2VvbV9iYXIocG9zaXRpb249cG9zaXRpb25fZG9kZ2UoKSwgc3RhdD0iaWRlbnRpdHkiLCBjb2xvdXI9J2JsYWNrJykgKwogIGdlb21fZXJyb3JiYXIoYWVzKHltaW49bWVhbi1zZCwgeW1heD1tZWFuK3NkKSwgd2lkdGg9LjIscG9zaXRpb249cG9zaXRpb25fZG9kZ2UoLjkpKSsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwLCB2anVzdCA9IDAuNSwgaGp1c3Q9MSkpKwogIGxhYnMoeCA9IlxuQ29yZCBibG9vZCBFUElDIChQUkVETykiKQoKcG5nKGZpbGVuYW1lPSJSZXN1bHRzL0ZpZ3VyZXMvZGlmZlRpc3N1ZXMvY29yZGVwaWNfY2VsbHNfcHJlZG8ucG5nIiwgd2lkdGg9MjMwMCwgaGVpZ2h0PTE1MDAsIHJlcz00MDApCnBsb3RfY2VsbHNfY29yZF9lcGljCmRldi5vZmYoKQpwbG90X2NlbGxzX2NvcmRfZXBpYwpgYGAKCnByZWRpY3RvcnMgZGVzY3JpcHRpdmUKYGBge3J9CkNvcmRibG9vZF9QcmVkc19QUkVETyA8LSBEYXRhX1BSRURPX0VQSUNjb3JkWyxjKCJDaGlsZF9TZXgiLCJEZWxpdmVyeV9Nb2RlX2RpY2hvdG9tIiwiaW5kdWNlZGxhYm91ciIsIlBhcml0eV9kaWNob3RvbSIsICJtYXRlcm5hbF9oeXBlcnRlbnNpb25fZGljaG90b20iLCAibWF0ZXJuYWxfZGlhYmV0ZXNfZGljaG90b20iLCAiTWF0ZXJuYWxfTWVudGFsX0Rpc29yZGVyc19CeV9DaGlsZGJpcnRoIiwic21va2luZ19kaWNob3RvbSIsIkFsY29ob2xfVXNlX0luX0Vhcmx5X1ByZWduYW5jeV8xOU9jdCIsIk1hdGVybmFsX0FnZV8xOFBvcFJlZ2FuZEJSIiwgICAiTWF0ZXJuYWxfUHJlcHJlZ25hbmN5Qk1JMThvY3QyOG5ldyIsICJCaXJ0aF9XZWlnaHQiLCAiQmlydGhfTGVuZ3RoIiwgIkhlYWRfQ2lyY3VtZmVyZW5jZV9hdF9CaXJ0aCIpXQpjb2xuYW1lcyhDb3JkYmxvb2RfUHJlZHNfUFJFRE8pIDwtIGMoImNoaWxkX3NleCIsICJkZWxpdmVyeV9tb2RlIiwgImluZHVjZWRfbGFib3IiLCAicGFyaXR5IiwgImh5cGVydGVuc2lvbiIsICJkaWFiZXRlcyIsICJtZW50YWxfZGlzb3JkZXJzIiwgInNtb2tpbmciLCAiYWxjb2hvbCIsICJtYXRlcm5hbF9hZ2UiLCAibWF0ZXJuYWxfQk1JIiwgImJpcnRoX3dlaWdodCIsICJiaXJ0aF9sZW5ndGgiLCAiaGVhZF9jaXJjdW1mZXJlbmNlIikKQ29yZGJsb29kX1ByZWRzX1BSRURPJGdyb3VwIDwtICJQUkVETyIKbGV2ZWxzKENvcmRibG9vZF9QcmVkc19QUkVETyRpbmR1Y2VkX2xhYm9yKVtsZXZlbHMoQ29yZGJsb29kX1ByZWRzX1BSRURPJGluZHVjZWRfbGFib3IpPT0iWWVzIl0gPC0gInllcyIKbGV2ZWxzKENvcmRibG9vZF9QcmVkc19QUkVETyRpbmR1Y2VkX2xhYm9yKVtsZXZlbHMoQ29yZGJsb29kX1ByZWRzX1BSRURPJGluZHVjZWRfbGFib3IpPT0iTm8iXSA8LSAibm8iCmxldmVscyhDb3JkYmxvb2RfUHJlZHNfUFJFRE8kZGlhYmV0ZXMpW2xldmVscyhDb3JkYmxvb2RfUHJlZHNfUFJFRE8kZGlhYmV0ZXMpPT0ibm8gZGlhYmV0ZXMgaW4gY3VycmVudCBwcmVnbmFuY3kiXSA8LSAibm8gZGlhYmV0ZXMgdGhpcyBwcmVnbmFuY3kiCmBgYAoKYGBge3J9CkNvcmRibG9vZF9QcmVkc19QUkVETyAlPiUgIApzZWxlY3RfaWYoaXMuZmFjdG9yKSAlPiUgCkhtaXNjOjpkZXNjcmliZSgpCmBgYAoKYGBge3J9CkNvcmRibG9vZF9QcmVkc19QUkVETyAlPiUKc2VsZWN0X2lmKGlzLm51bWVyaWMpICU+JSAKcHN5Y2g6OmRlc2NyaWJlKCkKYGBgCgoKIyMgQ29yZCBibG9vZCA0NTBLCkNsb2NrcwpgYGB7ciwgd2FybmluZz1GQUxTRX0Ka25pdHI6OmthYmxlKAogIHBzeWNoOjpkZXNjcmliZShEYXRhX1BSRURPXzQ1MEtjb3JkWyAsYygiR2VzdGF0aW9uYWxfQWdlIiwiRE5BbUdBX0tuaWdodCIsImRlbHRhX0tuaWdodCIsInpkZWx0YV9LbmlnaHQiLCAiRUFBUl9LbmlnaHQiLCAiRE5BbUdBX0JvaGxpbiIsImRlbHRhX0JvaGxpbiIsInpkZWx0YV9Cb2hsaW4iLCAiRUFBUl9Cb2hsaW4iKV0pCikKYGBgCgpjZWxsIHR5cGVzCmBgYHtyfQprbml0cjo6a2FibGUoCiAgcHN5Y2g6OmRlc2NyaWJlKERhdGFfUFJFRE9fNDUwS2NvcmRbICxjKCJDRDhUIiwgIkNENFQiLCAiTksiLCAiQmNlbGwiLCAiTW9ubyIsICJHcmFuIiwgIm5SQkMiKV0pCikKCkRhdGFfY2VsbHNfY29yZF80NTAgPC0gRGF0YV9QUkVET180NTBLY29yZFsgLGMoIlNhbXBsZV9OYW1lIiwgIkNEOFQiLCAiQ0Q0VCIsICJOSyIsICJCY2VsbCIsICJNb25vIiwgIkdyYW4iLCAiblJCQyIpXQogIApjZWxsc19jb3JkXzQ1MEsgPC0gZGF0YS5mcmFtZShwc3ljaDo6ZGVzY3JpYmUoRGF0YV9QUkVET180NTBLY29yZFsgLGMoIkNEOFQiLCAiQ0Q0VCIsICJOSyIsICJCY2VsbCIsICJNb25vIiwgIkdyYW4iLCAiblJCQyIpXSkpCmNlbGxzX2NvcmRfNDUwSyA8LSBjZWxsc19jb3JkXzQ1MEtbICxjKCJtZWFuIiwgInNkIildCnJvd25hbWVzKGNlbGxzX2NvcmRfNDUwSykgPC0gYygiQ0Q4VCIsICJDRDRUIiwgIk5LIiwgIkJjZWxsIiwgIk1vbm9jeXRlcyIsICJHcmFudWxvY3l0ZXMiLCAiblJCQyIpCiAgCnBsb3RfY2VsbHNfY29yZF80NTBLIDwtIGdncGxvdChjZWxsc19jb3JkXzQ1MEssIGFlcyh4PWFzLmZhY3Rvcihyb3duYW1lcyhjZWxsc19jb3JkXzQ1MEspKSwgeT1tZWFuKSkgKwogIGdlb21fYmFyKHBvc2l0aW9uPXBvc2l0aW9uX2RvZGdlKCksIHN0YXQ9ImlkZW50aXR5IiwgY29sb3VyPSdibGFjaycpICsKICBnZW9tX2Vycm9yYmFyKGFlcyh5bWluPW1lYW4tc2QsIHltYXg9bWVhbitzZCksIHdpZHRoPS4yLHBvc2l0aW9uPXBvc2l0aW9uX2RvZGdlKC45KSkrCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCwgdmp1c3QgPSAwLjUsIGhqdXN0PTEpKSsKICBsYWJzKHggPSJcbkNvcmQgYmxvb2QgNDUwSyAoUFJFRE8pIikKCnBuZyhmaWxlbmFtZT0iUmVzdWx0cy9GaWd1cmVzL2RpZmZUaXNzdWVzL2NvcmQ0NTBrX2NlbGxzX3ByZWRvLnBuZyIsIHdpZHRoPTIzMDAsIGhlaWdodD0xNTAwLCByZXM9NDAwKQpwbG90X2NlbGxzX2NvcmRfNDUwSwpkZXYub2ZmKCkKcGxvdF9jZWxsc19jb3JkXzQ1MEsKYGBgCgpwcmVkaWN0b3JzIGRlc2NyaXB0aXZlCmBgYHtyfQpDb3JkYmxvb2RfUHJlZHM0NTBLX1BSRURPIDwtIERhdGFfUFJFRE9fNDUwS2NvcmRbLGMoIkNoaWxkX1NleCIsIkRlbGl2ZXJ5X01vZGVfZGljaG90b20iLCJpbmR1Y2VkbGFib3VyIiwiUGFyaXR5X2RpY2hvdG9tIiwgIm1hdGVybmFsX2h5cGVydGVuc2lvbl9kaWNob3RvbSIsICJtYXRlcm5hbF9kaWFiZXRlc19kaWNob3RvbSIsICJNYXRlcm5hbF9NZW50YWxfRGlzb3JkZXJzX0J5X0NoaWxkYmlydGgiLCJzbW9raW5nX2RpY2hvdG9tIiwiQWxjb2hvbF9Vc2VfSW5fRWFybHlfUHJlZ25hbmN5XzE5T2N0IiwiTWF0ZXJuYWxfQWdlXzE4UG9wUmVnYW5kQlIiLCAgICJNYXRlcm5hbF9QcmVwcmVnbmFuY3lCTUkxOG9jdDI4bmV3IiwgIkJpcnRoX1dlaWdodCIsICJCaXJ0aF9MZW5ndGgiLCAiSGVhZF9DaXJjdW1mZXJlbmNlX2F0X0JpcnRoIildCmNvbG5hbWVzKENvcmRibG9vZF9QcmVkczQ1MEtfUFJFRE8pIDwtIGMoImNoaWxkX3NleCIsICJkZWxpdmVyeV9tb2RlIiwgImluZHVjZWRfbGFib3IiLCAicGFyaXR5IiwgImh5cGVydGVuc2lvbiIsICJkaWFiZXRlcyIsICJtZW50YWxfZGlzb3JkZXJzIiwgInNtb2tpbmciLCAiYWxjb2hvbCIsICJtYXRlcm5hbF9hZ2UiLCAibWF0ZXJuYWxfQk1JIiwgImJpcnRoX3dlaWdodCIsICJiaXJ0aF9sZW5ndGgiLCAiaGVhZF9jaXJjdW1mZXJlbmNlIikKQ29yZGJsb29kX1ByZWRzNDUwS19QUkVETyRncm91cCA8LSAiUFJFRE8iCmxldmVscyhDb3JkYmxvb2RfUHJlZHM0NTBLX1BSRURPJGluZHVjZWRfbGFib3IpW2xldmVscyhDb3JkYmxvb2RfUHJlZHM0NTBLX1BSRURPJGluZHVjZWRfbGFib3IpPT0iWWVzIl0gPC0gInllcyIKbGV2ZWxzKENvcmRibG9vZF9QcmVkczQ1MEtfUFJFRE8kaW5kdWNlZF9sYWJvcilbbGV2ZWxzKENvcmRibG9vZF9QcmVkczQ1MEtfUFJFRE8kaW5kdWNlZF9sYWJvcik9PSJObyJdIDwtICJubyIKbGV2ZWxzKENvcmRibG9vZF9QcmVkczQ1MEtfUFJFRE8kZGlhYmV0ZXMpW2xldmVscyhDb3JkYmxvb2RfUHJlZHM0NTBLX1BSRURPJGRpYWJldGVzKT09Im5vIGRpYWJldGVzIGluIGN1cnJlbnQgcHJlZ25hbmN5Il0gPC0gIm5vIGRpYWJldGVzIHRoaXMgcHJlZ25hbmN5IgpgYGAKCmBgYHtyfQpDb3JkYmxvb2RfUHJlZHM0NTBLX1BSRURPICU+JSAgCnNlbGVjdF9pZihpcy5mYWN0b3IpICU+JSAKSG1pc2M6OmRlc2NyaWJlKCkKYGBgCgpgYGB7cn0KQ29yZGJsb29kX1ByZWRzNDUwS19QUkVETyAlPiUKc2VsZWN0X2lmKGlzLm51bWVyaWMpICU+JSAKcHN5Y2g6OmRlc2NyaWJlKCkKYGBgCgojIyBQbGFjZW50YSBFUElDCkNsb2NrcwpgYGB7ciwgd2FybmluZz1GQUxTRX0Ka25pdHI6OmthYmxlKAogIHBzeWNoOjpkZXNjcmliZShEYXRhX1BSRURPX0VQSUNwbGFjZW50YVssYygiR2VzdGF0aW9uYWxfQWdlIiwiRE5BbUdBX0xlZSIsImRlbHRhX0xlZSIsInpkZWx0YV9MZWUiLCAiRUFBUl9MZWUiLCAiRE5BbUdBX01heW5lIiwiZGVsdGFfTWF5bmUiLCJ6ZGVsdGFfTWF5bmUiLCAiRUFBUl9NYXluZSIpXSkKKQpgYGAKCmNlbGwgdHlwZXMKYGBge3J9CmtuaXRyOjprYWJsZSgKICBwc3ljaDo6ZGVzY3JpYmUoRGF0YV9QUkVET19FUElDcGxhY2VudGFbICxjKCJUcm9waG9ibGFzdHMiLCAiU3Ryb21hbCIsICJIb2ZiYXVlciIsICJFbmRvdGhlbGlhbCIsICJuUkJDIiwgIlN5bmN5dGlvdHJvcGhvYmxhc3QiKV0pCikKCkRhdGFfY2VsbHNfcGxhY2VudGFfcHJlZCA8LSBEYXRhX1BSRURPX0VQSUNwbGFjZW50YVsgLGMoIlRyb3Bob2JsYXN0cyIsICJTdHJvbWFsIiwgIkhvZmJhdWVyIiwgIkVuZG90aGVsaWFsIiwgIm5SQkMiLCAiU3luY3l0aW90cm9waG9ibGFzdCIpXQoKY2VsbHNfcGxhY2VudGFfcHJlZG8gPC0gZGF0YS5mcmFtZShwc3ljaDo6ZGVzY3JpYmUoRGF0YV9QUkVET19FUElDcGxhY2VudGFbICxjKCJUcm9waG9ibGFzdHMiLCAiU3Ryb21hbCIsICJIb2ZiYXVlciIsICJFbmRvdGhlbGlhbCIsICJuUkJDIiwgIlN5bmN5dGlvdHJvcGhvYmxhc3QiKV0pKQpjZWxsc19jdnMgPC0gY2VsbHNfY3ZzWyAsYygibWVhbiIsICJzZCIpXQoKcGxvdF9jZWxsc19wbGFjZW50YV9wcmVkbyA8LSBnZ3Bsb3QoY2VsbHNfcGxhY2VudGFfcHJlZG8sIGFlcyh4PWFzLmZhY3Rvcihyb3duYW1lcyhjZWxsc19wbGFjZW50YV9wcmVkbykpLCB5PW1lYW4pKSArCiAgZ2VvbV9iYXIocG9zaXRpb249cG9zaXRpb25fZG9kZ2UoKSwgc3RhdD0iaWRlbnRpdHkiLCBjb2xvdXI9J2JsYWNrJykgKwogIGdlb21fZXJyb3JiYXIoYWVzKHltaW49bWVhbi1zZCwgeW1heD1tZWFuK3NkKSwgd2lkdGg9LjIscG9zaXRpb249cG9zaXRpb25fZG9kZ2UoLjkpKSsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwLCB2anVzdCA9IDAuNSwgaGp1c3Q9MSkpKwogIGxhYnMoeCA9IlxuZGVjaWR1YWwgUGxhY2VudGEgKFBSRURPKSIpCgpwbmcoZmlsZW5hbWU9IlJlc3VsdHMvRmlndXJlcy9kaWZmVGlzc3Vlcy9wbGFjZW50YV9jZWxsc19wcmVkby5wbmciLCB3aWR0aD0yMzAwLCBoZWlnaHQ9MTUwMCwgcmVzPTQwMCkKcGxvdF9jZWxsc19wbGFjZW50YV9wcmVkbwpkZXYub2ZmKCkKcGxvdF9jZWxsc19wbGFjZW50YV9wcmVkbwpgYGAKCnByZWRpY3RvcnMgZGVzY3JpcHRpdmUKYGBge3J9ClBsYWNlbnRhX1ByZWRzX1BSRURPIDwtIERhdGFfUFJFRE9fRVBJQ3BsYWNlbnRhWyxjKCJDaGlsZF9TZXgiLCJEZWxpdmVyeV9Nb2RlX2RpY2hvdG9tIiwiaW5kdWNlZGxhYm91ciIsIlBhcml0eV9kaWNob3RvbSIsICJtYXRlcm5hbF9oeXBlcnRlbnNpb25fZGljaG90b20iLCAibWF0ZXJuYWxfZGlhYmV0ZXNfZGljaG90b20iLCAiTWF0ZXJuYWxfTWVudGFsX0Rpc29yZGVyc19CeV9DaGlsZGJpcnRoIiwic21va2luZ19kaWNob3RvbSIsIkFsY29ob2xfVXNlX0luX0Vhcmx5X1ByZWduYW5jeV8xOU9jdCIsIk1hdGVybmFsX0FnZV8xOFBvcFJlZ2FuZEJSIiwgICAiTWF0ZXJuYWxfUHJlcHJlZ25hbmN5Qk1JMThvY3QyOG5ldyIsICJCaXJ0aF9XZWlnaHQiLCAiQmlydGhfTGVuZ3RoIiwgIkhlYWRfQ2lyY3VtZmVyZW5jZV9hdF9CaXJ0aCIpXQpjb2xuYW1lcyhQbGFjZW50YV9QcmVkc19QUkVETykgPC0gYygiY2hpbGRfc2V4IiwgImRlbGl2ZXJ5X21vZGUiLCAiaW5kdWNlZF9sYWJvciIsICJwYXJpdHkiLCAiaHlwZXJ0ZW5zaW9uIiwgImRpYWJldGVzIiwgIm1lbnRhbF9kaXNvcmRlcnMiLCAic21va2luZyIsICJhbGNvaG9sIiwgIm1hdGVybmFsX2FnZSIsICJtYXRlcm5hbF9CTUkiLCAiYmlydGhfd2VpZ2h0IiwgImJpcnRoX2xlbmd0aCIsICJoZWFkX2NpcmN1bWZlcmVuY2UiKQpQbGFjZW50YV9QcmVkc19QUkVETyRncm91cCA8LSAiUFJFRE8iCmxldmVscyhQbGFjZW50YV9QcmVkc19QUkVETyRpbmR1Y2VkX2xhYm9yKVtsZXZlbHMoUGxhY2VudGFfUHJlZHNfUFJFRE8kaW5kdWNlZF9sYWJvcik9PSJZZXMiXSA8LSAieWVzIgpsZXZlbHMoUGxhY2VudGFfUHJlZHNfUFJFRE8kaW5kdWNlZF9sYWJvcilbbGV2ZWxzKFBsYWNlbnRhX1ByZWRzX1BSRURPJGluZHVjZWRfbGFib3IpPT0iTm8iXSA8LSAibm8iCmxldmVscyhQbGFjZW50YV9QcmVkc19QUkVETyRkaWFiZXRlcylbbGV2ZWxzKFBsYWNlbnRhX1ByZWRzX1BSRURPJGRpYWJldGVzKT09Im5vIGRpYWJldGVzIGluIGN1cnJlbnQgcHJlZ25hbmN5Il0gPC0gIm5vIGRpYWJldGVzIHRoaXMgcHJlZ25hbmN5IgpgYGAKCmBgYHtyfQpQbGFjZW50YV9QcmVkc19QUkVETyAlPiUgIApzZWxlY3RfaWYoaXMuZmFjdG9yKSAlPiUgCkhtaXNjOjpkZXNjcmliZSgpCmBgYAoKYGBge3J9ClBsYWNlbnRhX1ByZWRzX1BSRURPICU+JQpzZWxlY3RfaWYoaXMubnVtZXJpYykgJT4lIApwc3ljaDo6ZGVzY3JpYmUoKQpgYGAKCi0gbW9kZWwgd2l0aG91dCBhbGNvaG9sCgo8IS0tIGBgYHtyfSAtLT4KPCEtLSBsb2FkKCJJbnB1dERhdGEvQ2xvY2tDYWxjdWxhdGlvbnNJbnB1dC9SZWdfSW5wdXRfRGF0YV9QbGFjZW50YV9QUkVET19FQUFSX25vTmFfbi5SZGF0YSIpIC0tPgo8IS0tIGBgYCAtLT4KCmBgYHtyfQpSZWdfSW5wdXRfRGF0YV9QbGFjZW50YV9QUkVET19FQUFSX25vTmFfbiAlPiUKICBzZWxlY3RfaWYoaXMuZmFjdG9yKSAlPiUKICBIbWlzYzo6ZGVzY3JpYmUoKQoKUmVnX0lucHV0X0RhdGFfUGxhY2VudGFfUFJFRE9fRUFBUl9ub05hX24gJT4lCiAgc2VsZWN0X2lmKGlzLm51bWVyaWMpICU+JQogIEhtaXNjOjpkZXNjcmliZSgpCmBgYAoKLSBtb2RlbCB3aXRoIGFsY29ob2wKCjwhLS0gYGBge3J9IC0tPgo8IS0tIGxvYWQoIklucHV0RGF0YS9DbG9ja0NhbGN1bGF0aW9uc0lucHV0L1JlZ19JbnB1dF9EYXRhX1BsYWNlbnRhX1BSRURPX0VBQVJfbm9OYV93YS5SZGF0YSIpIC0tPgo8IS0tIGBgYCAtLT4KCmBgYHtyfQpSZWdfSW5wdXRfRGF0YV9QbGFjZW50YV9QUkVET19FQUFSX25vTmFfd2EgJT4lCiAgc2VsZWN0X2lmKGlzLmZhY3RvcikgJT4lCiAgSG1pc2M6OmRlc2NyaWJlKCkKClJlZ19JbnB1dF9EYXRhX1BsYWNlbnRhX1BSRURPX0VBQVJfbm9OYV93YSAlPiUKICBzZWxlY3RfaWYoaXMubnVtZXJpYykgJT4lCiAgSG1pc2M6OmRlc2NyaWJlKCkKCiMxMi4zJSBtYXRlcm5hbCBhbGNvaG9sIHVzZQpgYGAKClt0byB0aGUgdG9wXSgjdG9wKSAKCiMgQ2VsbCBUeXBlIE92ZXJ2aWV3CioqQ2VsbCBUeXBlIE92ZXJ2aWV3IElUVSAmIFBSRURPKioKYGBge3J9CiNncmlkLmFycmFuZ2UocGxvdF9jZWxsc19jb3JkLCBwbG90X2NlbGxzX2NvcmRfZXBpYywgcGxvdF9jZWxsc19jb3JkXzQ1MEssIG5jb2w9MykKCmdnYXJyYW5nZShwbG90X2NlbGxzX2NvcmQgKwogICAgICAgICAgICAgICB0aGVtZShheGlzLnRpY2tzLnkgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgICAgICAgICAgICAgIHBsb3QubWFyZ2luID0gbWFyZ2luKHIgPSAxKSApLCAKICAgICAgICAgIHBsb3RfY2VsbHNfY29yZF9lcGljICsgCiAgICAgICAgICAgICAgIHRoZW1lKGF4aXMudGV4dC55ID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgICAgICAgICAgICAgICBheGlzLnRpY2tzLnkgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgICAgICAgICAgICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICAgICAgICAgICAgICAgcGxvdC5tYXJnaW4gPSBtYXJnaW4ociA9IDEsIGwgPSAxKSApLCAKICAgICAgICAgIHBsb3RfY2VsbHNfY29yZF80NTBLICsgCiAgICAgICAgICAgICAgIHRoZW1lKGF4aXMudGV4dC55ID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgICAgICAgICAgICAgICBheGlzLnRpY2tzLnkgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgICAgICAgICAgICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICAgICAgICAgICAgICAgcGxvdC5tYXJnaW4gPSBtYXJnaW4obCA9IDEpICApLAogICAgICAgICAgbnJvdyA9IDEpCgpnZ2FycmFuZ2UocGxvdF9jZWxsc19jdnMgKwogICAgICAgICAgICAgICB0aGVtZShheGlzLnRpY2tzLnkgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgICAgICAgICAgICAgIHBsb3QubWFyZ2luID0gbWFyZ2luKHIgPSAxKSApLCAKICAgICAgICAgIHBsb3RfY2VsbHNfcGxhY2VudGEgKyAKICAgICAgICAgICAgICAgdGhlbWUoYXhpcy50ZXh0LnkgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgICAgICAgICAgICAgIGF4aXMudGlja3MueSA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICAgICAgICAgICAgICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgICAgICAgICAgICAgICBwbG90Lm1hcmdpbiA9IG1hcmdpbihyID0gMSwgbCA9IDEpICksIAogICAgICAgICAgcGxvdF9jZWxsc19wbGFjZW50YV9wcmVkbyArIAogICAgICAgICAgICAgICB0aGVtZShheGlzLnRleHQueSA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICAgICAgICAgICAgICAgYXhpcy50aWNrcy55ID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgICAgICAgICAgICAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgICAgICAgICAgICAgIHBsb3QubWFyZ2luID0gbWFyZ2luKGwgPSAxKSAgKSwKICAgICAgICAgIG5yb3cgPSAxKQpgYGAKClt0byB0aGUgdG9wXSgjdG9wKSAKCiMgY29tcGFyaXNvbiBQUkVETyAmIElUVSBpbiBwcmVkaWN0b3JzIHsjcHJlZGljdG9yc0lUVVBSRURPfSAgCiMjIHBsYWNlbnRhCmBgYHtyfQpQbGFjZW50YV9QcmVkcyA8LSByYmluZChQbGFjZW50YV9QcmVkc19JVFUsIFBsYWNlbnRhX1ByZWRzX1BSRURPKQpgYGAKCmNvbnRpbnVvdXMgcHJlZGljdG9ycywgdC10ZXN0CmBgYHtyfQpwbGFjZW50YV9wcmVkX3QgPC0gUGxhY2VudGFfUHJlZHMgJT4lIAogIHNlbGVjdF9pZihpcy5udW1lcmljKSAlPiUKICBtYXBfZGYofiBicm9vbTo6dGlkeSh0LnRlc3QoLiB+IFBsYWNlbnRhX1ByZWRzJGdyb3VwKSksIC5pZCA9ICd2YXInKQoKcGxhY2VudGFfcHJlZF90IApgYGAKCmBgYHtyfQp0LnRlc3QobWF0ZXJuYWxfYWdlIH4gZ3JvdXAsIGRhdGE9UGxhY2VudGFfUHJlZHMpJGVzdGltYXRlCnQudGVzdChtYXRlcm5hbF9CTUkgfiBncm91cCwgZGF0YT1QbGFjZW50YV9QcmVkcykkZXN0aW1hdGUKdC50ZXN0KGJpcnRoX3dlaWdodCB+IGdyb3VwLCBkYXRhPVBsYWNlbnRhX1ByZWRzKSRlc3RpbWF0ZQp0LnRlc3QoYmlydGhfbGVuZ3RoIH4gZ3JvdXAsIGRhdGE9UGxhY2VudGFfUHJlZHMpJGVzdGltYXRlCmBgYAoKYGBge3J9CnAuYWRqdXN0KHBsYWNlbnRhX3ByZWRfdCRwLnZhbHVlLCBtZXRob2QgPSAiYm9uZmVycm9uaSIsIG4gPSAxNSkKYGBgCgpjYXRlZ29yaWNhbApgYGB7cn0KcGxhY2VudGFfcHJlZF9jaGkgPC0gUGxhY2VudGFfUHJlZHMgJT4lIAogIHNlbGVjdF9pZihpcy5mYWN0b3IpICU+JQogIG1hcF9kZih+IGJyb29tOjp0aWR5KGNoaXNxLnRlc3QoLiAsUGxhY2VudGFfUHJlZHMkZ3JvdXAsIGNvcnJlY3Q9RikpLCAuaWQgPSAndmFyJykKCnBsYWNlbnRhX3ByZWRfY2hpCmBgYAoKYGBge3J9CnAuYWRqdXN0KHBsYWNlbnRhX3ByZWRfY2hpJHAudmFsdWUsIG1ldGhvZCA9ICJib25mZXJyb25pIiwgbiA9IDE1KQpgYGAKCmBgYHtyfQp0YWJsZShQbGFjZW50YV9QcmVkcyRkZWxpdmVyeV9tb2RlLCBQbGFjZW50YV9QcmVkcyRncm91cCkKdGFibGUoUGxhY2VudGFfUHJlZHMkaHlwZXJ0ZW5zaW9uLCBQbGFjZW50YV9QcmVkcyRncm91cCkKdGFibGUoUGxhY2VudGFfUHJlZHMkZGlhYmV0ZXMsIFBsYWNlbnRhX1ByZWRzJGdyb3VwKQp0YWJsZShQbGFjZW50YV9QcmVkcyRzbW9raW5nLCBQbGFjZW50YV9QcmVkcyRncm91cCkKYGBgCgojIyBjb3JkYmxvb2QgRVBJQwoKYGBge3J9CkNvcmRibG9vZF9QcmVkcyA8LSByYmluZChDb3JkYmxvb2RfUHJlZHNfSVRVLCBDb3JkYmxvb2RfUHJlZHNfUFJFRE8pCmBgYAoKY29udGludW91cyBwcmVkaWN0b3JzLCB0LXRlc3QKYGBge3J9CmNvcmRibG9vZF9wcmVkX3QgPC0gQ29yZGJsb29kX1ByZWRzICU+JSAKICBzZWxlY3RfaWYoaXMubnVtZXJpYykgJT4lCiAgbWFwX2RmKH4gYnJvb206OnRpZHkodC50ZXN0KC4gfiBDb3JkYmxvb2RfUHJlZHMkZ3JvdXApKSwgLmlkID0gJ3ZhcicpCgpjb3JkYmxvb2RfcHJlZF90IAojIG1hdGVybmFsIGFnZSwgbWF0ZXJuYWwgQk1JCmBgYApgYGB7cn0KdC50ZXN0KG1hdGVybmFsX2FnZSB+IGdyb3VwLCBkYXRhPUNvcmRibG9vZF9QcmVkcykkZXN0aW1hdGUKdC50ZXN0KG1hdGVybmFsX0JNSSB+IGdyb3VwLCBkYXRhPUNvcmRibG9vZF9QcmVkcykkZXN0aW1hdGUKYGBgCgpgYGB7cn0KcC5hZGp1c3QoY29yZGJsb29kX3ByZWRfdCRwLnZhbHVlLCBtZXRob2QgPSAiYm9uZmVycm9uaSIsIG4gPSAxNSkKIyBvbmx5IG1hdGVybmFsIGFnZQpgYGAKCmNhdGVnb3JpY2FsCmBgYHtyfQpjb3JkYmxvb2RfcHJlZF9jaGkgPC0gQ29yZGJsb29kX1ByZWRzICU+JSAKICBzZWxlY3RfaWYoaXMuZmFjdG9yKSAlPiUKICBtYXBfZGYofiBicm9vbTo6dGlkeShjaGlzcS50ZXN0KC4gLENvcmRibG9vZF9QcmVkcyRncm91cCwgY29ycmVjdD1GKSksIC5pZCA9ICd2YXInKQoKY29yZGJsb29kX3ByZWRfY2hpCiMgcGFyaXR5LCBoeXBlcnRlbnNpb24sIHNtb2tpbmcKYGBgCgpgYGB7cn0KcC5hZGp1c3QoY29yZGJsb29kX3ByZWRfY2hpJHAudmFsdWUsIG1ldGhvZCA9ICJib25mZXJyb25pIiwgbiA9IDE1KQojIG9ubHkgaHlwZXJ0ZW5zaW9uCmBgYAoKYGBge3J9CnRhYmxlKENvcmRibG9vZF9QcmVkcyRkZWxpdmVyeV9tb2RlLCBDb3JkYmxvb2RfUHJlZHMkZ3JvdXApCnRhYmxlKENvcmRibG9vZF9QcmVkcyRoeXBlcnRlbnNpb24sIENvcmRibG9vZF9QcmVkcyRncm91cCkKdGFibGUoQ29yZGJsb29kX1ByZWRzJGRpYWJldGVzLCBDb3JkYmxvb2RfUHJlZHMkZ3JvdXApCnRhYmxlKENvcmRibG9vZF9QcmVkcyRzbW9raW5nLCBDb3JkYmxvb2RfUHJlZHMkZ3JvdXApCmBgYAoKIyMgY29yZGJsb29kIDQ1MEsKYGBge3J9CkNvcmRibG9vZF9QcmVkczQ1MEsgPC0gcmJpbmQoQ29yZGJsb29kX1ByZWRzX0lUVSwgQ29yZGJsb29kX1ByZWRzNDUwS19QUkVETykKYGBgCgpjb250aW51b3VzIHByZWRpY3RvcnMsIHQtdGVzdApgYGB7cn0KY29yZGJsb29kX3ByZWQ0NTBLX3QgPC0gQ29yZGJsb29kX1ByZWRzNDUwSyAlPiUgCiAgc2VsZWN0X2lmKGlzLm51bWVyaWMpICU+JQogIG1hcF9kZih+IGJyb29tOjp0aWR5KHQudGVzdCguIH4gQ29yZGJsb29kX1ByZWRzNDUwSyRncm91cCkpLCAuaWQgPSAndmFyJykKCmNvcmRibG9vZF9wcmVkNDUwS190IAojIG1hdGVybmFsIGFnZSBhbmQgQk1JCmBgYAoKYGBge3J9CnQudGVzdChtYXRlcm5hbF9hZ2UgfiBncm91cCwgZGF0YT1Db3JkYmxvb2RfUHJlZHM0NTBLKSRlc3RpbWF0ZQp0LnRlc3QobWF0ZXJuYWxfQk1JIH4gZ3JvdXAsIGRhdGE9Q29yZGJsb29kX1ByZWRzNDUwSykkZXN0aW1hdGUKYGBgCgpgYGB7cn0KcC5hZGp1c3QoY29yZGJsb29kX3ByZWQ0NTBLX3QkcC52YWx1ZSwgbWV0aG9kID0gImJvbmZlcnJvbmkiLCBuID0gMTUpCmBgYAoKY2F0ZWdvcmljYWwKYGBge3J9CmNvcmRibG9vZF9wcmVkNDUwS19jaGkgPC0gQ29yZGJsb29kX1ByZWRzNDUwSyAlPiUgCiAgc2VsZWN0X2lmKGlzLmZhY3RvcikgJT4lCiAgbWFwX2RmKH4gYnJvb206OnRpZHkoY2hpc3EudGVzdCguICxDb3JkYmxvb2RfUHJlZHM0NTBLJGdyb3VwLCBjb3JyZWN0PUYpKSwgLmlkID0gJ3ZhcicpCgpjb3JkYmxvb2RfcHJlZDQ1MEtfY2hpCiMgcGFyaXR5LCBoeXBlcnRlbnNpb24sIGRpYWJldGVzLCBhbGNvaG9sCmBgYAoKYGBge3J9CnAuYWRqdXN0KGNvcmRibG9vZF9wcmVkNDUwS19jaGkkcC52YWx1ZSwgbWV0aG9kID0gImJvbmZlcnJvbmkiLCBuID0gMTUpCiMgb25seSBwYXJpdHksIGh5cGVydGVuc2lvbgpgYGAKCmBgYHtyfQp0YWJsZShDb3JkYmxvb2RfUHJlZHM0NTBLJHBhcml0eSwgQ29yZGJsb29kX1ByZWRzNDUwSyRncm91cCkKdGFibGUoQ29yZGJsb29kX1ByZWRzNDUwSyRoeXBlcnRlbnNpb24sIENvcmRibG9vZF9QcmVkczQ1MEskZ3JvdXApCnRhYmxlKENvcmRibG9vZF9QcmVkczQ1MEskZGlhYmV0ZXMsIENvcmRibG9vZF9QcmVkczQ1MEskZ3JvdXApCnRhYmxlKENvcmRibG9vZF9QcmVkczQ1MEskYWxjb2hvbCwgQ29yZGJsb29kX1ByZWRzNDUwSyRncm91cCkKYGBgClt0byB0aGUgdG9wXSgjdG9wKQoKIyBQcmVkaWN0b3JzIGNvcnJlbGF0aW9ucwpGaWcuIDIgICAKCiMjIElUVTogbG9vayBhdCBwcmVkaWN0b3JzLCBpbiBmdWxsIGRhdGEgKGFsbCBwZXJzb25zKSB7I1ByZWRpY3RvcnNJVFVBbGx9ICAKCmBgYHtyfQppZmVsc2UoIWRpci5leGlzdHMoZmlsZS5wYXRoKGdldHdkKCksICJSZXN1bHRzL0ZpZ3VyZXMvcHJlZGljdG9yc19jb3JzIikpLCBkaXIuY3JlYXRlKGZpbGUucGF0aChnZXR3ZCgpLCAiUmVzdWx0cy9GaWd1cmVzL3ByZWRpY3RvcnNfY29ycyIpKSwgRkFMU0UpCmBgYAoKYGBge3J9CklucHV0X0lUVV9hbGwgPC0gRGF0YV9JVFVfYWxsWyAsIShuYW1lcyhEYXRhX0lUVV9hbGwpICVpbiUgYygiU2FtcGxlX05hbWUiLCAiUEMxX2V0aG5pY2l0eSIsICJQQzJfZXRobmljaXR5IikpXQpuYW1lcyhJbnB1dF9JVFVfYWxsKSA8LSBjKCJjaGlsZCBzZXgiLCAibWF0ZXJuYWwgYWdlIiwgIm1hdGVybmFsIHNtb29raW5nIiwgImRlbGl2ZXJ5IG1vZGUiLCAibWF0ZXJuYWwgQk1JIiwgImJpcnRoIHdlaWdodCIsICJiaXJ0aCBsZW5ndGgiLCAiaGVhZCBjaXJjdW1mZXJlbmNlIiwgIlBhcml0eSIsICJpbmR1Y2VkIGxhYm9yIiwgIm1hdGVybmFsIGh5cGVydGVuc2lvbiIsICJtYXRlcm5hbCBkaWFiZXRlcyIsICJtYXRlcm5hbCBtZW50YWwgZGlzb3JkZXJzIiwgIm1hdGVybmFsIGFsY29ob2wgdXNlIikKYGBgCgpgYGB7cn0KSW5wdXRfTV9hbGwgPC0gbW9kZWwubWF0cml4KH4wKy4sIGRhdGE9SW5wdXRfSVRVX2FsbCkKY29sbmFtZXMoSW5wdXRfTV9hbGwpIDwtIGMoIm1hbGUiLCJmZW1hbGUiLCAibWF0ZXJuYWwgYWdlIiwgIm1hdGVybmFsIHNtb2tpbmciLCAiZGVsaXZlcnkgbW9kZSIsICJtYXRlcm5hbCBCTUkiLCAiYmlydGggd2VpZ2h0IiwgImJpcnRoIGxlbmd0aCIsICJoZWFkIGNpcmN1bWZlcmVuY2UiLCAicGFyaXR5IiwgImluZHVjZWQgbGFib3IiLCAibWF0ZXJuYWwgaHlwZXJ0ZW5zaW9uIiwgIm1hdGVybmFsIGRpYWJldGVzIiwgIm1hdGVybmFsIG1lbnRhbCBkaXNvcmRlcnMiLCAibWF0ZXJuYWwgYWxjb2hvbCB1c2UiKQpgYGAKCmBgYHtyfQpJbnB1dF9NX2FsbCAlPiUKICBjb3IodXNlPSJwYWlyd2lzZS5jb21wbGV0ZS5vYnMiKSAlPiUgCiAgY29ycnBsb3QodHlwZT0idXBwZXIiLCB0bC5jb2w9ImJsYWNrIikKYGBgCgpgYGB7cn0KcG5nKCJSZXN1bHRzL0ZpZ3VyZXMvcHJlZGljdG9yc19jb3JzL0lUVV9hbGwucG5nIiwgd2lkdGg9MTYwMCwgaGVpZ2h0PSAxNTAwLCByZXM9MzUwKQpJbnB1dF9NX2FsbCAlPiUKICBjb3IodXNlPSJwYWlyd2lzZS5jb21wbGV0ZS5vYnMiKSAlPiUgCiAgY29ycnBsb3QodHlwZT0idXBwZXIiLCB0bC5jb2w9ImJsYWNrIikKICB0aGVtZShwbG90Lm1hcmdpbj11bml0KGMoLTAuMzAsMCwwLDApLCAibnVsbCIpKSAjIHJlbW92ZSBtYXJnaW4gYXJvdW5kIHBsb3QKZGV2Lm9mZigpCmBgYAoKCmBgYHtyfQpjb3JyLnRlc3QoSW5wdXRfSVRVX2FsbFs2OjhdKQpgYGAKClt0byB0aGUgdG9wXSgjdG9wKQoKIyMgUFJFRE86IGxvb2sgYXQgcHJlZGljdG9ycywgaW4gZnVsbCBkYXRhIChhbGwgcGVyc29ucykgeyNQcmVkaWN0b3JzUFJFRE9BbGx9CgpgYGB7cn0KSW5wdXRfUFJFRE9fRVBJQ19hbGwgPC0gRGF0YV9QUkVET19FUElDX2FsbFsgLCEobmFtZXMoRGF0YV9QUkVET19FUElDX2FsbCkgJWluJSBjKCJTYW1wbGVfTmFtZSIsICJQQzEiLCAiUEMyIikpXQpuYW1lcyhJbnB1dF9QUkVET19FUElDX2FsbCkgPC0gYygiY2hpbGQgc2V4IiwgIm1hdGVybmFsIGFnZSIsICJtYXRlcm5hbCBzbW9va2luZyIsICJkZWxpdmVyeSBtb2RlIiwgIm1hdGVybmFsIEJNSSIsICJiaXJ0aCB3ZWlnaHQiLCAiYmlydGggbGVuZ3RoIiwgImhlYWQgY2lyY3VtZmVyZW5jZSIsICJwYXJpdHkiLCAiaW5kdWNlZCBsYWJvciIsICJtYXRlcm5hbCBoeXBlcnRlbnNpb24iLCAibWF0ZXJuYWwgZGlhYmV0ZXMiLCAibWF0ZXJuYWwgbWVudGFsIGRpc29yZGVycyIsICJtYXRlcm5hbCBhbGNvaG9sIHVzZSIpCmBgYAoKYGBge3J9CklucHV0X01fUFJFRE9fRVBJQ19hbGwgPC0gbW9kZWwubWF0cml4KH4wKy4sIGRhdGE9SW5wdXRfUFJFRE9fRVBJQ19hbGwpCmNvbG5hbWVzKElucHV0X01fUFJFRE9fRVBJQ19hbGwpIDwtIGMoIm1hbGUiLCJmZW1hbGUiLCAibWF0ZXJuYWwgYWdlIiwgIm1hdGVybmFsIHNtb2tpbmciLCAiZGVsaXZlcnkgbW9kZSIsICJtYXRlcm5hbCBCTUkiLCAiYmlydGggd2VpZ2h0IiwgImJpcnRoIGxlbmd0aCIsICJoZWFkIGNpcmN1bWZlcmVuY2UiLCAicGFyaXR5IiwgImluZHVjZWQgbGFib3IiLCAibWF0ZXJuYWwgaHlwZXJ0ZW5zaW9uIiwgIm1hdGVybmFsIGRpYWJldGVzIiwgIm1hdGVybmFsIG1lbnRhbCBkaXNvcmRlcnMiLCAibWF0ZXJuYWwgYWxjb2hvbCB1c2UiKQpgYGAKCmBgYHtyfQpJbnB1dF9NX1BSRURPX0VQSUNfYWxsICU+JQogIGNvcih1c2U9InBhaXJ3aXNlLmNvbXBsZXRlLm9icyIpICU+JSAKICBjb3JycGxvdCh0eXBlPSJ1cHBlciIsIHRsLmNvbD0iYmxhY2siKQpgYGAKCmBgYHtyfQpwbmcoIlJlc3VsdHMvRmlndXJlcy9wcmVkaWN0b3JzX2NvcnMvUFJFRE9fRVBJQ19hbGwucG5nIiwgd2lkdGg9MTYwMCwgaGVpZ2h0PSAxNTAwLCByZXM9MzUwKQpJbnB1dF9NX1BSRURPX0VQSUNfYWxsICU+JQogIGNvcih1c2U9InBhaXJ3aXNlLmNvbXBsZXRlLm9icyIpICU+JSAKICBjb3JycGxvdCh0eXBlPSJ1cHBlciIsIHRsLmNvbD0iYmxhY2siKQpkZXYub2ZmKCkKIyBtYXIgPSBjKDAsIDAsIDAsIDIpCmBgYAoKCmBgYHtyfQpjb3JyLnRlc3QoSW5wdXRfUFJFRE9fRVBJQ19hbGxbNjo4XSkKYGBgCgojIGNvcnJlbGF0aW9uIEROQW1HQS1HQQpBZGRpdGlvbmFsIGZpbGUgNywgVGFibGUgMgoKIyMgSVRVOiBnZXN0YXRpb25hbCBhZ2UgZXBpZ2VuZXRpYyBhZ2UgY29ycmVsYXRpb24gKHNlcGFyYXRlIGZvciBldmVyeSB0aXNzdWUpIHsjY29yRE5BbUdBR0FJVFV9CgpgYGB7cn0KaWZlbHNlKCFkaXIuZXhpc3RzKGZpbGUucGF0aChnZXR3ZCgpLCAiUmVzdWx0cy9GaWd1cmVzL2NvckROQW1HQUdBIikpLCBkaXIuY3JlYXRlKGZpbGUucGF0aChnZXR3ZCgpLCAiUmVzdWx0cy9GaWd1cmVzL2NvckROQW1HQUdBIikpLCBGQUxTRSkKYGBgCgoqKkNWUyoqICAKKkxlZSBjbG9jayoKYGBge3J9CmNvci50ZXN0KERhdGFfQ1ZTX0lUVSRETkFtR0FfTGVlLCBEYXRhX0NWU19JVFUkZ2VzdGFnZV9hdF9DVlNfd2Vla3MsIG1ldGhvZD0icGVhcnNvbiIpCgoKY29yQ1ZTR0FfTGVlIDwtIGdnc2NhdHRlcihEYXRhX0NWU19JVFUsIHggPSAiZ2VzdGFnZV9hdF9DVlNfd2Vla3MiLCB5ID0gIkROQW1HQV9MZWUiLCAKICAgICAgICAgIGFkZCA9ICJyZWcubGluZSIsIGNvbmYuaW50ID0gVFJVRSwgCiAgICAgICAgICBjb3IuY29lZiA9IFRSVUUsIGNvci5tZXRob2QgPSAicGVhcnNvbiIsCiAgICAgICAgICB4bGFiID0gImdlc3RhdGlvbmFsIGFnZSBhdCBzYW1wbGluZyAod2Vla3MpIiwgeWxhYiA9ICJwcmVkaWN0ZWQgZ2VzdGF0aW9uYWwgYWdlIGZyb20gRE5BbSAod2Vla3MpIiwgdGl0bGU9IkNWUyIsIHN1YnRpdGxlPSJMZWUgY2xvY2siKQoKcGxvdENWU0dBX0xlZSA8LSBnZ3Bsb3QoRGF0YV9DVlNfSVRVLCBhZXMoeCA9Z2VzdGFnZV9hdF9DVlNfd2Vla3MsIHkgPUROQW1HQV9MZWUpKSsgCiAgZ2VvbV9wb2ludChzaGFwZT0xKSsKICB4bGFiKCJnZXN0YXRpb25hbCBhZ2UgYXQgc2FtcGxpbmcgKHdlZWtzKSIpKwogIHlsYWIoInByZWRpY3RlZCBnZXN0YXRpb25hbCBhZ2UgZnJvbSBETkFtICh3ZWVrcykiKSsKICBnZW9tX2FibGluZShpbnRlcmNlcHQgPSAwLCBzbG9wZSA9IDEpKwogIGdndGl0bGUoIkNWUyBcbkxlZSBjbG9jayIpCgpncmlkLmFycmFuZ2UoY29yQ1ZTR0FfTGVlLCBwbG90Q1ZTR0FfTGVlLCBuY29sPTIpCgp0aWZmKCJSZXN1bHRzL0ZpZ3VyZXMvY29yRE5BbUdBR0EvRE5BbUdBR0FfY29yX0xlZV9DVlNfSVRVLnRpZmYiLCB1bml0cz0iaW4iLCB3aWR0aD04LCBoZWlnaHQ9NSwgcmVzPTMwMCkKY29yQ1ZTR0FfTGVlCmRldi5vZmYoKQoKdGlmZigiUmVzdWx0cy9GaWd1cmVzL2NvckROQW1HQUdBL0ROQW1HQUdBX3Bsb3RfTGVlX0NWU19JVFUudGlmZiIsIHVuaXRzPSJpbiIsIHdpZHRoPTgsIGhlaWdodD01LCByZXM9MzAwKQpwbG90Q1ZTR0FfTGVlCmRldi5vZmYoKQpgYGAKCgoqTWF5bmUgY2xvY2s6KgpgYGB7cn0KY29yLnRlc3QoRGF0YV9DVlNfSVRVJEROQW1HQV9NYXluZSwgRGF0YV9DVlNfSVRVJGdlc3RhZ2VfYXRfQ1ZTX3dlZWtzLCBtZXRob2Q9InBlYXJzb24iKQoKY29yQ1ZTR0FfTWF5bmUgPC0gZ2dzY2F0dGVyKERhdGFfQ1ZTX0lUVSwgeCA9ICJnZXN0YWdlX2F0X0NWU193ZWVrcyIsIHkgPSAiRE5BbUdBX01heW5lIiwgCiAgICAgICAgICBhZGQgPSAicmVnLmxpbmUiLCBjb25mLmludCA9IFRSVUUsIAogICAgICAgICAgY29yLmNvZWYgPSBUUlVFLCBjb3IubWV0aG9kID0gInBlYXJzb24iLAogICAgICAgICAgeGxhYiA9ICJnZXN0YXRpb25hbCBhZ2UgYXQgc2FtcGxpbmcgKHdlZWtzKSIsIHlsYWIgPSAicHJlZGljdGVkIGdlc3RhdGlvbmFsIGFnZSBmcm9tIEROQW0gKHdlZWtzKSIsIHRpdGxlPSIgQ1ZTIiwgc3VidGl0bGU9Ik1heW5lIGNsb2NrIikKCnBsb3RDVlNHQV9NYXluZSA8LSBnZ3Bsb3QoRGF0YV9DVlNfSVRVLCBhZXMoeCA9Z2VzdGFnZV9hdF9DVlNfd2Vla3MsIHkgPUROQW1HQV9NYXluZSkpKyAKICBnZW9tX3BvaW50KHNoYXBlPTEpKwogIHhsYWIoImdlc3RhdGlvbmFsIGFnZSBhdCBzYW1wbGluZyAod2Vla3MpIikrCiAgeWxhYigicHJlZGljdGVkIGdlc3RhdGlvbmFsIGFnZSBmcm9tIEROQW0gKHdlZWtzKSIpKwogIGdlb21fYWJsaW5lKGludGVyY2VwdCA9IDAsIHNsb3BlID0gMSkrCiAgZ2d0aXRsZSgiQ1ZTIFxuTWF5bmUgY2xvY2siKQoKZ3JpZC5hcnJhbmdlKGNvckNWU0dBX01heW5lLCBwbG90Q1ZTR0FfTWF5bmUsIG5jb2w9MikKCnRpZmYoIlJlc3VsdHMvRmlndXJlcy9jb3JETkFtR0FHQS9ETkFtR0FHQV9jb3JfTWF5bmVfQ1ZTX0lUVS50aWZmIiwgdW5pdHM9ImluIiwgd2lkdGg9OCwgaGVpZ2h0PTUsIHJlcz0zMDApCmNvckNWU0dBX01heW5lCmRldi5vZmYoKQoKdGlmZigiUmVzdWx0cy9GaWd1cmVzL2NvckROQW1HQUdBL0ROQW1HQUdBX3Bsb3RfTWF5bmVfQ1ZTX0lUVS50aWZmIiwgdW5pdHM9ImluIiwgd2lkdGg9OCwgaGVpZ2h0PTUsIHJlcz0zMDApCnBsb3RDVlNHQV9NYXluZQpkZXYub2ZmKCkKYGBgCgoqKkNvcmRibG9vZCoqICAKKktuaWdodCBjbG9jayoKYGBge3J9CmNvci50ZXN0KERhdGFfQ29yZF9JVFUkRE5BbUdBX0tuaWdodCwgRGF0YV9Db3JkX0lUVSRHZXN0YXRpb25hbF9BZ2VfV2Vla3MsIG1ldGhvZD0icGVhcnNvbiIpCgpjb3JDb3JkR0FfS25pZ2h0IDwtIGdnc2NhdHRlcihEYXRhX0NvcmRfSVRVLCB4ID0gIkdlc3RhdGlvbmFsX0FnZV9XZWVrcyIsIHkgPSAiRE5BbUdBX0tuaWdodCIsIAogICAgICAgICAgYWRkID0gInJlZy5saW5lIiwgY29uZi5pbnQgPSBUUlVFLCAKICAgICAgICAgIGNvci5jb2VmID0gVFJVRSwgY29yLm1ldGhvZCA9ICJwZWFyc29uIiwKICAgICAgICAgIHhsYWIgPSAiZ2VzdGF0aW9uYWwgYWdlIGF0IGJpcnRoICh3ZWVrcykiLCB5bGFiID0gInByZWRpY3RlZCBnZXN0YXRpb25hbCBhZ2UgZnJvbSBETkFtICh3ZWVrcykiLCB0aXRsZT0iQ29yZGJsb29kIiwgc3VidGl0bGU9IktuaWdodCBjbG9jayIpCgpwbG90Q29yZEdBX0tuaWdodCA8LSBnZ3Bsb3QoRGF0YV9Db3JkX0lUVSwgYWVzKHggPUdlc3RhdGlvbmFsX0FnZV9XZWVrcywgeSA9RE5BbUdBX0tuaWdodCkpKyAKICBnZW9tX3BvaW50KHNoYXBlPTEpKwogIHhsYWIoImdlc3RhdGlvbmFsIGFnZSBhdCBiaXJ0aCAod2Vla3MpIikrCiAgeWxhYigicHJlZGljdGVkIGdlc3RhdGlvbmFsIGFnZSBmcm9tIEROQW0gKHdlZWtzKSIpKwogIGdlb21fYWJsaW5lKGludGVyY2VwdCA9IDAsIHNsb3BlID0gMSkrCiAgZ2d0aXRsZSgiQ29yZGJsb29kIFxuS25pZ2h0IGNsb2NrIikKCmdyaWQuYXJyYW5nZShjb3JDb3JkR0FfS25pZ2h0LCBwbG90Q29yZEdBX0tuaWdodCwgbmNvbD0yKQoKdGlmZigiUmVzdWx0cy9GaWd1cmVzL2NvckROQW1HQUdBL0ROQW1HQUdBX2Nvcl9Db3JkX0tuaWdodF9JVFUudGlmZiIsIHVuaXRzPSJpbiIsIHdpZHRoPTgsIGhlaWdodD01LCByZXM9MzAwKQpjb3JDb3JkR0FfS25pZ2h0CmRldi5vZmYoKQoKdGlmZigiUmVzdWx0cy9GaWd1cmVzL2NvckROQW1HQUdBL0ROQW1HQUdBX3Bsb3RfQ29yZF9LbmlnaHRfSVRVLnRpZmYiLCB1bml0cz0iaW4iLCB3aWR0aD04LCBoZWlnaHQ9NSwgcmVzPTMwMCkKcGxvdENvcmRHQV9LbmlnaHQKZGV2Lm9mZigpCgojIyBLbmlnaHQgVGVzdGluZyBEYXRhIHNldCBjb3JyZWxhdGlvbjogcj0wLjkxOyBpbmRpdmlkdWFsIHRlc3Qgc2V0cyByPTAuNTIgJiAwLjY1KQojIyBHaXJjaGVua28gY29ycmVsYXRpb24gcj0wLjUxCiMjIFBhbG1hLUd1ZGllbDogcj0wLjc2CiMjIFN1YXJlejogcj0uMC41MgpgYGAKCgoqQm9obGluIENsb2NrKgpgYGB7cn0KY29yLnRlc3QoRGF0YV9Db3JkX0lUVSRETkFtR0FfQm9obGluLCBEYXRhX0NvcmRfSVRVJEdlc3RhdGlvbmFsX0FnZV9XZWVrcywgbWV0aG9kPSJwZWFyc29uIikKCmNvckNvcmRHQV9Cb2hsaW4gPC0gZ2dzY2F0dGVyKERhdGFfQ29yZF9JVFUsIHggPSAiR2VzdGF0aW9uYWxfQWdlX1dlZWtzIiwgeSA9ICJETkFtR0FfQm9obGluIiwgCiAgICAgICAgICBhZGQgPSAicmVnLmxpbmUiLCBjb25mLmludCA9IFRSVUUsIAogICAgICAgICAgY29yLmNvZWYgPSBUUlVFLCBjb3IubWV0aG9kID0gInBlYXJzb24iLAogICAgICAgICAgeGxhYiA9ICJnZXN0YXRpb25hbCBhZ2UgYXQgYmlydGggKHdlZWtzKSIsIHlsYWIgPSAicHJlZGljdGVkIGdlc3RhdGlvbmFsIGFnZSBmcm9tIEROQW0gKHdlZWtzKSIsIHRpdGxlPSJDb3JkYmxvb2QiLCBzdWJ0aXRsZT0iQm9obGluIGNsb2NrIikKCnBsb3RDb3JkR0FfQm9obGluIDwtIGdncGxvdChEYXRhX0NvcmRfSVRVLCBhZXMoeCA9IEdlc3RhdGlvbmFsX0FnZV9XZWVrcywgeSA9RE5BbUdBX0JvaGxpbikpKyAKICBnZW9tX3BvaW50KHNoYXBlPTEpKwogIHhsYWIoImdlc3RhdGlvbmFsIGFnZSBhdCBiaXJ0aCAod2Vla3MpIikrCiAgeWxhYigicHJlZGljdGVkIGdlc3RhdGlvbmFsIGFnZSBmcm9tIEROQW0gKHdlZWtzKSIpKwogIGdlb21fYWJsaW5lKGludGVyY2VwdCA9IDAsIHNsb3BlID0gMSkrCiAgZ2d0aXRsZSgiQ29yZGJsb29kIFxuQm9obGluIGNsb2NrIikKCmdyaWQuYXJyYW5nZShjb3JDb3JkR0FfQm9obGluLCBwbG90Q29yZEdBX0JvaGxpbiwgbmNvbD0yKQoKdGlmZigiUmVzdWx0cy9GaWd1cmVzL2NvckROQW1HQUdBL0ROQW1HQUdBX2Nvcl9Db3JkX0JvaGxpbl9JVFUudGlmZiIsIHVuaXRzPSJpbiIsIHdpZHRoPTgsIGhlaWdodD01LCByZXM9MzAwKQpjb3JDb3JkR0FfQm9obGluCmRldi5vZmYoKQoKdGlmZigiUmVzdWx0cy9GaWd1cmVzL2NvckROQW1HQUdBL0ROQW1HQUdBX3Bsb3RfQ29yZF9Cb2hsaW5fSVRVLnRpZmYiLCB1bml0cz0iaW4iLCB3aWR0aD04LCBoZWlnaHQ9NSwgcmVzPTMwMCkKcGxvdENvcmRHQV9Cb2hsaW4KZGV2Lm9mZigpCgojIyBTaW1wa2luIGNvcnJlbGF0aW9uIGluIEFMU1BBQyByPTAuNjUKYGBgCgoqKlBsYWNlbnRhKiogIAoqTGVlIENsb2NrKgpgYGB7cn0KY29yLnRlc3QoRGF0YV9QbGFjZW50YV9JVFUkRE5BbUdBX0xlZSwgRGF0YV9QbGFjZW50YV9JVFUkR2VzdGF0aW9uYWxfQWdlX1dlZWtzLCBtZXRob2Q9InBlYXJzb24iKQoKY29yUGxhY2VudGFHQV9MZWUgPC0gZ2dzY2F0dGVyKERhdGFfUGxhY2VudGFfSVRVLCB4ID0gIkdlc3RhdGlvbmFsX0FnZV9XZWVrcyIsIHkgPSAiRE5BbUdBX0xlZSIsIAogICAgICAgICAgYWRkID0gInJlZy5saW5lIiwgY29uZi5pbnQgPSBUUlVFLCAKICAgICAgICAgIGNvci5jb2VmID0gVFJVRSwgY29yLm1ldGhvZCA9ICJwZWFyc29uIiwKICAgICAgICAgIHhsYWIgPSAiZ2VzdGF0aW9uYWwgYWdlIGF0IGJpcnRoICh3ZWVrcykiLCB5bGFiID0gInByZWRpY3RlZCBnZXN0YXRpb25hbCBhZ2UgZnJvbSBETkFtICh3ZWVrcykiLCB0aXRsZT0iUGxhY2VudGEiLCBzdWJ0aXRsZT0iTGVlIGNsb2NrIikKCnBsb3RQbGFjZW50YUdBX0xlZSA8LSBnZ3Bsb3QoRGF0YV9QbGFjZW50YV9JVFUsIGFlcyh4ID1HZXN0YXRpb25hbF9BZ2VfV2Vla3MsIHk9RE5BbUdBX0xlZSkpKyAKICBnZW9tX3BvaW50KHNoYXBlPTEpKwogIHhsYWIoImdlc3RhdGlvbmFsIGFnZSBhdCBiaXJ0aCAod2Vla3MpIikrCiAgeWxhYigicHJlZGljdGVkIGdlc3RhdGlvbmFsIGFnZSBmcm9tIEROQW0gKHdlZWtzKSIpKwogIGdlb21fYWJsaW5lKGludGVyY2VwdCA9IDAsIHNsb3BlID0gMSkrCiAgZ2d0aXRsZSgiUGxhY2VudGEgXG5MZWUgY2xvY2siKQoKZ3JpZC5hcnJhbmdlKGNvclBsYWNlbnRhR0FfTGVlLCBwbG90UGxhY2VudGFHQV9MZWUsIG5jb2w9MikKCnRpZmYoIlJlc3VsdHMvRmlndXJlcy9jb3JETkFtR0FHQS9ETkFtR0FHQV9jb3JfUGxhY2VudGFfTGVlX0lUVS50aWZmIiwgdW5pdHM9ImluIiwgd2lkdGg9OCwgaGVpZ2h0PTUsIHJlcz0zMDApCmNvclBsYWNlbnRhR0FfTGVlCmRldi5vZmYoKQoKdGlmZigiUmVzdWx0cy9GaWd1cmVzL2NvckROQW1HQUdBL0ROQW1HQUdBX3Bsb3RfUGxhY2VudGFfTGVlX0lUVS50aWZmIiwgdW5pdHM9ImluIiwgd2lkdGg9OCwgaGVpZ2h0PTUsIHJlcz0zMDApCnBsb3RQbGFjZW50YUdBX0xlZQpkZXYub2ZmKCkKYGBgCgoKKk1heW5lIENsb2NrKgpgYGB7cn0KY29yLnRlc3QoRGF0YV9QbGFjZW50YV9JVFUkRE5BbUdBX01heW5lLCBEYXRhX1BsYWNlbnRhX0lUVSRHZXN0YXRpb25hbF9BZ2VfV2Vla3MsIG1ldGhvZD0icGVhcnNvbiIpCgpjb3JQbGFjZW50YUdBX01heW5lIDwtIGdnc2NhdHRlcihEYXRhX1BsYWNlbnRhX0lUVSwgeCA9ICJHZXN0YXRpb25hbF9BZ2VfV2Vla3MiLCB5ID0gIkROQW1HQV9NYXluZSIsIAogICAgICAgICAgYWRkID0gInJlZy5saW5lIiwgY29uZi5pbnQgPSBUUlVFLCAKICAgICAgICAgIGNvci5jb2VmID0gVFJVRSwgY29yLm1ldGhvZCA9ICJwZWFyc29uIiwKICAgICAgICAgIHhsYWIgPSAiZ2VzdGF0aW9uYWwgYWdlIGF0IGJpcnRoICh3ZWVrcykiLCB5bGFiID0gInByZWRpY3RlZCBnZXN0YXRpb25hbCBhZ2UgZnJvbSBETkFtICh3ZWVrcykiLCB0aXRsZT0iUGxhY2VudGEiLCBzdWJ0aXRsZT0iTWF5bmUgY2xvY2siKQoKcGxvdFBsYWNlbnRhR0FfTWF5bmUgPC0gZ2dwbG90KERhdGFfUGxhY2VudGFfSVRVLCBhZXMoeCA9R2VzdGF0aW9uYWxfQWdlX1dlZWtzLCB5ID1ETkFtR0FfTWF5bmUpKSsgCiAgZ2VvbV9wb2ludChzaGFwZT0xKSsKICB4bGFiKCJnZXN0YXRpb25hbCBhZ2UgYXQgYmlydGggKHdlZWtzKSIpKwogIHlsYWIoInByZWRpY3RlZCBnZXN0YXRpb25hbCBhZ2UgZnJvbSBETkFtICh3ZWVrcykiKSsKICBnZW9tX2FibGluZShpbnRlcmNlcHQgPSAwLCBzbG9wZSA9IDEpKwogIGdndGl0bGUoIlBsYWNlbnRhIFxuTWF5bmUiKQoKZ3JpZC5hcnJhbmdlKGNvclBsYWNlbnRhR0FfTWF5bmUsIHBsb3RQbGFjZW50YUdBX01heW5lLCBuY29sPTIpCgp0aWZmKCJSZXN1bHRzL0ZpZ3VyZXMvY29yRE5BbUdBR0EvRE5BbUdBR0FfY29yX1BsYWNlbnRhX01heW5lX0lUVS50aWZmIiwgdW5pdHM9ImluIiwgd2lkdGg9OCwgaGVpZ2h0PTUsIHJlcz0zMDApCmNvclBsYWNlbnRhR0FfTWF5bmUKZGV2Lm9mZigpCgp0aWZmKCJSZXN1bHRzL0ZpZ3VyZXMvY29yRE5BbUdBR0EvRE5BbUdBR0FfcGxvdF9QbGFjZW50YV9NYXluZV9JVFUudGlmZiIsIHVuaXRzPSJpbiIsIHdpZHRoPTgsIGhlaWdodD01LCByZXM9MzAwKQpwbG90UGxhY2VudGFHQV9NYXluZSAKZGV2Lm9mZigpCmBgYAoKW3RvIHRoZSB0b3BdKCN0b3ApIAoKIyMgUFJFRE86IGdlc3RhdGlvbmFsIGFnZSBlcGlnZW5ldGljIGFnZSBjb3JyZWxhdGlvbiAoc2VwYXJhdGUgZm9yIGV2ZXJ5IHRpc3N1ZSkgeyNjb3JETkFtR0FHQVBSRURPfSAgCgoqKjQ1MEsgQ29yZGJsb29kKioKKktuaWdodCoKd2l0aCB0aGUgZnVsbCBlc3RpbWF0b3IsIEtuaWdodApgYGB7cn0KY29yLnRlc3QoRGF0YV9QUkVET180NTBLY29yZCRETkFtR0FfS25pZ2h0LCBEYXRhX1BSRURPXzQ1MEtjb3JkJEdlc3RhdGlvbmFsX0FnZSwgbWV0aG9kPSJwZWFyc29uIikKCmNvckNvcmRfS25pZ2h0X1A0NTAgPC0gZ2dzY2F0dGVyKERhdGFfUFJFRE9fNDUwS2NvcmQsIHggPSAiR2VzdGF0aW9uYWxfQWdlIiwgeSA9ICJETkFtR0FfS25pZ2h0IiwgCiAgICAgICAgICBhZGQgPSAicmVnLmxpbmUiLCBjb25mLmludCA9IFRSVUUsIAogICAgICAgICAgY29yLmNvZWYgPSBUUlVFLCBjb3IubWV0aG9kID0gInBlYXJzb24iLAogICAgICAgICAgeGxhYiA9ICJnZXN0YXRpb25hbCBhZ2UgYXQgc2FtcGxpbmcgKHdlZWtzKSIsIHlsYWIgPSAicHJlZGljdGVkIGdlc3RhdGlvbmFsIGFnZSBmcm9tIEROQW0gKHdlZWtzKSIsIHRpdGxlPSJDb3JkYmxvb2QgKDQ1MEspIiwgc3VidGl0bGU9IktuaWdodCBjbG9jayIpCgpwbG90Q29yZF9LbmlnaHRfUDQ1MCA8LSBnZ3Bsb3QoRGF0YV9QUkVET180NTBLY29yZCwgYWVzKHggPUdlc3RhdGlvbmFsX0FnZSwgeSA9RE5BbUdBX0tuaWdodCkpKyAKICBnZW9tX3BvaW50KHNoYXBlPTEpKwogIHhsYWIoImdlc3RhdGlvbmFsIGFnZSBhdCBzYW1wbGluZyAod2Vla3MpIikrCiAgeWxhYigicHJlZGljdGVkIGdlc3RhdGlvbmFsIGFnZSBmcm9tIEROQW0gKHdlZWtzKSIpKwogIGdlb21fYWJsaW5lKGludGVyY2VwdCA9IDAsIHNsb3BlID0gMSkrCiAgZ2d0aXRsZSgiQ29yZGJsb29kICg0NTBLKSBcbktuaWdodCBjbG9jayIpCgpncmlkLmFycmFuZ2UoY29yQ29yZF9LbmlnaHRfUDQ1MCwgcGxvdENvcmRfS25pZ2h0X1A0NTAsIG5jb2w9MikKCnRpZmYoIlJlc3VsdHMvRmlndXJlcy9jb3JETkFtR0FHQS9ETkFtR0FHQV9jb3JfQ29yZDQ1MEtfS25pZ2h0X1BSRURPLnRpZmYiLCB1bml0cz0iaW4iLCB3aWR0aD04LCBoZWlnaHQ9NSwgcmVzPTMwMCkKY29yQ29yZF9LbmlnaHRfUDQ1MApkZXYub2ZmKCkKCnRpZmYoIlJlc3VsdHMvRmlndXJlcy9jb3JETkFtR0FHQS9ETkFtR0FHQV9wbG90X0NvcmQ0NTBLX0tuaWdodF9QUkVETy50aWZmIiwgdW5pdHM9ImluIiwgd2lkdGg9OCwgaGVpZ2h0PTUsIHJlcz0zMDApCnBsb3RDb3JkX0tuaWdodF9QNDUwIApkZXYub2ZmKCkKYGBgCgoKYGBge3J9CiNEYXRhX1BSRURPXzQ1MEtjb3JkW3doaWNoLm1pbihEYXRhX1BSRURPXzQ1MEtjb3JkJEdlc3RhdGlvbmFsX0FnZSksXSAjKHZpc3VhbCkgb3V0bGllciwgcm93IDcwCiMgZXhjbHVkZSB0aGlzIG91dGxpZXIgdG8gc2VlIHdoYXQgY29ycmVsYXRpb24gd291bGQgYmUgdGhlbgpjb3IudGVzdChEYXRhX1BSRURPXzQ1MEtjb3JkJEROQW1HQV9LbmlnaHRbLTcwXSwgRGF0YV9QUkVET180NTBLY29yZCRHZXN0YXRpb25hbF9BZ2VbLTcwXSwgbWV0aG9kPSJwZWFyc29uIikKCkRhdGFfUFJFRE9fNDUwS2NvcmRfb3V0b3V0IDwtIERhdGFfUFJFRE9fNDUwS2NvcmRbLTcwLCBdCmdnc2NhdHRlcihEYXRhX1BSRURPXzQ1MEtjb3JkX291dG91dCwgeCA9ICJHZXN0YXRpb25hbF9BZ2UiLCB5ID0gIkROQW1HQV9LbmlnaHQiLCAKICAgICAgICAgYWRkID0gInJlZy5saW5lIiwgY29uZi5pbnQgPSBUUlVFLCAKICAgICAgICAgY29yLmNvZWYgPSBUUlVFLCBjb3IubWV0aG9kID0gInBlYXJzb24iLAogICAgICAgICB4bGFiID0gImdlc3RhdGlvbmFsIGFnZSBhdCBzYW1wbGluZyAod2Vla3MpIiwgeWxhYiA9ICJwcmVkaWN0ZWQgZ2VzdGF0aW9uYWwgYWdlIGZyb20gRE5BbSAod2Vla3MpIiwgdGl0bGU9IkNvcmRibG9vZCAoNDUwSykiLCBzdWJ0aXRsZT0id2l0aCBvdXRsaWVyIHJlbW92ZWQiKQpgYGAKCgoqQm9obGluKgp3aXRoIHRoZSBmdWxsIGVzdGltYXRvcgpgYGB7cn0KY29yLnRlc3QoRGF0YV9QUkVET180NTBLY29yZCRETkFtR0FfQm9obGluLCBEYXRhX1BSRURPXzQ1MEtjb3JkJEdlc3RhdGlvbmFsX0FnZSwgbWV0aG9kPSJwZWFyc29uIikKCmNvckNvcmRfQm9obGluX1A0NTAgPC0gZ2dzY2F0dGVyKERhdGFfUFJFRE9fNDUwS2NvcmQsIHggPSAiR2VzdGF0aW9uYWxfQWdlIiwgeSA9ICJETkFtR0FfQm9obGluIiwgCiAgICAgICAgICBhZGQgPSAicmVnLmxpbmUiLCBjb25mLmludCA9IFRSVUUsIAogICAgICAgICAgY29yLmNvZWYgPSBUUlVFLCBjb3IubWV0aG9kID0gInBlYXJzb24iLAogICAgICAgICAgeGxhYiA9ICJnZXN0YXRpb25hbCBhZ2UgYXQgc2FtcGxpbmcgKHdlZWtzKSIsIHlsYWIgPSAicHJlZGljdGVkIGdlc3RhdGlvbmFsIGFnZSBmcm9tIEROQW0gKHdlZWtzKSIsIHRpdGxlPSJDb3JkYmxvb2QgKDQ1MEspIiwgc3VidGl0bGU9IkJvaGxpbiBjbG9jayIpCgpwbG90Q29yZF9Cb2hsaW5fUDQ1MCA8LSBnZ3Bsb3QoRGF0YV9QUkVET180NTBLY29yZCwgYWVzKHggPUdlc3RhdGlvbmFsX0FnZSwgeSA9RE5BbUdBX0JvaGxpbikpKyAKICBnZW9tX3BvaW50KHNoYXBlPTEpKwogIHhsYWIoImdlc3RhdGlvbmFsIGFnZSBhdCBzYW1wbGluZyAod2Vla3MpIikrCiAgeWxhYigicHJlZGljdGVkIGdlc3RhdGlvbmFsIGFnZSBmcm9tIEROQW0gKHdlZWtzKSIpKwogIGdlb21fYWJsaW5lKGludGVyY2VwdCA9IDAsIHNsb3BlID0gMSkrCiAgZ2d0aXRsZSgiQ29yZGJsb29kICg0NTBLKSBcbkJvaGxpbiIpCgpncmlkLmFycmFuZ2UoY29yQ29yZF9Cb2hsaW5fUDQ1MCwgcGxvdENvcmRfQm9obGluX1A0NTAsIG5jb2w9MikKCnRpZmYoIlJlc3VsdHMvRmlndXJlcy9jb3JETkFtR0FHQS9ETkFtR0FHQV9jb3JfQ29yZDQ1MEtfQm9obGluX1BSRURPLnRpZmYiLCB1bml0cz0iaW4iLCB3aWR0aD0xMCwgaGVpZ2h0PTUsIHJlcz0zMDApCmNvckNvcmRfQm9obGluX1A0NTAKZGV2Lm9mZigpCgp0aWZmKCJSZXN1bHRzL0ZpZ3VyZXMvY29yRE5BbUdBR0EvRE5BbUdBR0FfcGxvdF9Db3JkNDUwS19Cb2hsaW5fUFJFRE8udGlmZiIsIHVuaXRzPSJpbiIsIHdpZHRoPTEwLCBoZWlnaHQ9NSwgcmVzPTMwMCkKcGxvdENvcmRfQm9obGluX1A0NTAKZGV2Lm9mZigpCmBgYAoKKipFUElDIENvcmRibG9vZCoqICAKKktuaWdodCoKYGBge3J9CmNvci50ZXN0KERhdGFfUFJFRE9fRVBJQ2NvcmQkRE5BbUdBX0tuaWdodCwgRGF0YV9QUkVET19FUElDY29yZCRHZXN0YXRpb25hbF9BZ2UsIG1ldGhvZD0icGVhcnNvbiIpCgpjb3JDb3JkX0tuaWdodF9QIDwtIGdnc2NhdHRlcihEYXRhX1BSRURPX0VQSUNjb3JkLCB4ID0gIkdlc3RhdGlvbmFsX0FnZSIsIHkgPSAiRE5BbUdBX0tuaWdodCIsIAogICAgICAgICAgYWRkID0gInJlZy5saW5lIiwgY29uZi5pbnQgPSBUUlVFLCAKICAgICAgICAgIGNvci5jb2VmID0gVFJVRSwgY29yLm1ldGhvZCA9ICJwZWFyc29uIiwKICAgICAgICAgIHhsYWIgPSAiZ2VzdGF0aW9uYWwgYWdlIGF0IHNhbXBsaW5nICh3ZWVrcykiLCB5bGFiID0gInByZWRpY3RlZCBnZXN0YXRpb25hbCBhZ2UgZnJvbSBETkFtICh3ZWVrcykiLCB0aXRsZT0iQ29yZGJsb29kIChFUElDKSIsIHN1YnRpdGxlPSJLbmlnaHQgY2xvY2siKQoKcGxvdENvcmRfS25pZ2h0X1AgPC0gZ2dwbG90KERhdGFfUFJFRE9fRVBJQ2NvcmQsIGFlcyh4ID1HZXN0YXRpb25hbF9BZ2UsIHkgPUROQW1HQV9LbmlnaHQpKSsgCiAgZ2VvbV9wb2ludChzaGFwZT0xKSsKICB4bGFiKCJnZXN0YXRpb25hbCBhZ2UgYXQgc2FtcGxpbmcgKHdlZWtzKSIpKwogIHlsYWIoInByZWRpY3RlZCBnZXN0YXRpb25hbCBhZ2UgZnJvbSBETkFtICh3ZWVrcykiKSsKICBnZW9tX2FibGluZShpbnRlcmNlcHQgPSAwLCBzbG9wZSA9IDEpKwogIGdndGl0bGUoIkNvcmRibG9vZCAoRVBJQykgXG5LbmlnaHQgY2xvY2siKQoKZ3JpZC5hcnJhbmdlKGNvckNvcmRfS25pZ2h0X1AsIHBsb3RDb3JkX0tuaWdodF9QLCBuY29sPTIpCgp0aWZmKCJSZXN1bHRzL0ZpZ3VyZXMvY29yRE5BbUdBR0EvRE5BbUdBR0FfY29yX0NvcmRfS25pZ2h0X1BSRURPLnRpZmYiLCB1bml0cz0iaW4iLCB3aWR0aD0xMCwgaGVpZ2h0PTUsIHJlcz0zMDApCmNvckNvcmRfS25pZ2h0X1AKZGV2Lm9mZigpCgp0aWZmKCJSZXN1bHRzL0ZpZ3VyZXMvY29yRE5BbUdBR0EvRE5BbUdBR0FfcGxvdF9Db3JkX0tuaWdodF9QUkVETy50aWZmIiwgdW5pdHM9ImluIiwgd2lkdGg9MTAsIGhlaWdodD01LCByZXM9MzAwKQpwbG90Q29yZF9LbmlnaHRfUApkZXYub2ZmKCkKYGBgCgoqQm9obGluKjoKYGBge3J9CmNvci50ZXN0KERhdGFfUFJFRE9fRVBJQ2NvcmQkRE5BbUdBX0JvaGxpbiwgRGF0YV9QUkVET19FUElDY29yZCRHZXN0YXRpb25hbF9BZ2UsIG1ldGhvZD0icGVhcnNvbiIpCgpjb3JDb3JkX0JvaGxpbl9QIDwtIGdnc2NhdHRlcihEYXRhX1BSRURPX0VQSUNjb3JkLCB4ID0gIkdlc3RhdGlvbmFsX0FnZSIsIHkgPSAiRE5BbUdBX0JvaGxpbiIsIAogICAgICAgICAgYWRkID0gInJlZy5saW5lIiwgY29uZi5pbnQgPSBUUlVFLCAKICAgICAgICAgIGNvci5jb2VmID0gVFJVRSwgY29yLm1ldGhvZCA9ICJwZWFyc29uIiwKICAgICAgICAgIHhsYWIgPSAiZ2VzdGF0aW9uYWwgYWdlIGF0IHNhbXBsaW5nICh3ZWVrcykiLCB5bGFiID0gInByZWRpY3RlZCBnZXN0YXRpb25hbCBhZ2UgZnJvbSBETkFtICh3ZWVrcykiLCB0aXRsZT0iQ29yZGJsb29kIChFUElDKSIsIHN1YnRpdGxlPSJCb2hsaW4gY2xvY2siKQoKcGxvdENvcmRfQm9obGluX1AgPC0gZ2dwbG90KERhdGFfUFJFRE9fRVBJQ2NvcmQsIGFlcyh4ID1HZXN0YXRpb25hbF9BZ2UsIHkgPUROQW1HQV9Cb2hsaW4pKSsgCiAgZ2VvbV9wb2ludChzaGFwZT0xKSsKICB4bGFiKCJnZXN0YXRpb25hbCBhZ2UgYXQgc2FtcGxpbmcgKHdlZWtzKSIpKwogIHlsYWIoInByZWRpY3RlZCBnZXN0YXRpb25hbCBhZ2UgZnJvbSBETkFtICh3ZWVrcykiKSsKICBnZW9tX2FibGluZShpbnRlcmNlcHQgPSAwLCBzbG9wZSA9IDEpKwogIGdndGl0bGUoIkNvcmRibG9vZCAoRVBJQykgXG5Cb2hsaW4iKQoKZ3JpZC5hcnJhbmdlKGNvckNvcmRfQm9obGluX1AsIHBsb3RDb3JkX0JvaGxpbl9QLCBuY29sPTIpCgp0aWZmKCJSZXN1bHRzL0ZpZ3VyZXMvY29yRE5BbUdBR0EvRE5BbUdBR0FfY29yX0NvcmRfQm9obGluX1BSRURPLnRpZmYiLCB1bml0cz0iaW4iLCB3aWR0aD0xMCwgaGVpZ2h0PTUsIHJlcz0zMDApCmNvckNvcmRfQm9obGluX1AKZGV2Lm9mZigpCgp0aWZmKCJSZXN1bHRzL0ZpZ3VyZXMvY29yRE5BbUdBR0EvRE5BbUdBR0FfcGxvdF9Db3JkX0JvaGxpbl9QUkVETy50aWZmIiwgdW5pdHM9ImluIiwgd2lkdGg9MTAsIGhlaWdodD01LCByZXM9MzAwKQpwbG90Q29yZF9Cb2hsaW5fUApkZXYub2ZmKCkKYGBgCgoqKkVQSUMgUGxhY2VudGEqKiAgCipMZWUqCmBgYHtyfQpjb3IudGVzdChEYXRhX1BSRURPX0VQSUNwbGFjZW50YSRETkFtR0FfTGVlLCBEYXRhX1BSRURPX0VQSUNwbGFjZW50YSRHZXN0YXRpb25hbF9BZ2UsIG1ldGhvZD0icGVhcnNvbiIpCgpjb3JQbGFjZW50YV9MZWVfUCA8LSBnZ3NjYXR0ZXIoRGF0YV9QUkVET19FUElDcGxhY2VudGEsIHggPSAiR2VzdGF0aW9uYWxfQWdlIiwgeSA9ICJETkFtR0FfTGVlIiwgCiAgICAgICAgICBhZGQgPSAicmVnLmxpbmUiLCBjb25mLmludCA9IFRSVUUsIAogICAgICAgICAgY29yLmNvZWYgPSBUUlVFLCBjb3IubWV0aG9kID0gInBlYXJzb24iLAogICAgICAgICAgeGxhYiA9ICJnZXN0YXRpb25hbCBhZ2UgYXQgc2FtcGxpbmcgKHdlZWtzKSIsIHlsYWIgPSAicHJlZGljdGVkIGdlc3RhdGlvbmFsIGFnZSBmcm9tIEROQW0gKHdlZWtzKSIsIHRpdGxlPSJQbGFjZW50YSAoRVBJQykiLCBzdWJ0aXRsZT0iTGVlIGNsb2NrIikKCnBsb3RQbGFjZW50YV9MZWVfUCA8LSBnZ3Bsb3QoRGF0YV9QUkVET19FUElDcGxhY2VudGEsIGFlcyh4ID1HZXN0YXRpb25hbF9BZ2UsIHkgPUROQW1HQV9MZWUpKSsgCiAgZ2VvbV9wb2ludChzaGFwZT0xKSsKICB4bGFiKCJnZXN0YXRpb25hbCBhZ2UgYXQgc2FtcGxpbmcgKHdlZWtzKSIpKwogIHlsYWIoInByZWRpY3RlZCBnZXN0YXRpb25hbCBhZ2UgZnJvbSBETkFtICh3ZWVrcykiKSsKICBnZW9tX2FibGluZShpbnRlcmNlcHQgPSAwLCBzbG9wZSA9IDEpKwogIGdndGl0bGUoIlBsYWNlbnRhIChFUElDKSBcbkxlZSBjbG9jayIpCgpncmlkLmFycmFuZ2UoY29yUGxhY2VudGFfTGVlX1AsIHBsb3RQbGFjZW50YV9MZWVfUCwgbmNvbD0yKQoKdGlmZigiUmVzdWx0cy9GaWd1cmVzL2NvckROQW1HQUdBL0ROQW1HQUdBX2Nvcl9QbGFjZW50YV9MZWVfUFJFRE8udGlmZiIsIHVuaXRzPSJpbiIsIHdpZHRoPTEwLCBoZWlnaHQ9NSwgcmVzPTMwMCkKY29yUGxhY2VudGFfTGVlX1AKZGV2Lm9mZigpCgp0aWZmKCJSZXN1bHRzL0ZpZ3VyZXMvY29yRE5BbUdBR0EvRE5BbUdBR0FfcGxvdF9QbGFjZW50YV9MZWVfUFJFRE8udGlmZiIsIHVuaXRzPSJpbiIsIHdpZHRoPTEwLCBoZWlnaHQ9NSwgcmVzPTMwMCkKcGxvdFBsYWNlbnRhX0xlZV9QCmRldi5vZmYoKQpgYGAKCipNYXluZSoKYGBge3J9CmNvci50ZXN0KERhdGFfUFJFRE9fRVBJQ3BsYWNlbnRhJEROQW1HQV9NYXluZSwgRGF0YV9QUkVET19FUElDcGxhY2VudGEkR2VzdGF0aW9uYWxfQWdlLCBtZXRob2Q9InBlYXJzb24iKQoKY29yUGxhY2VudGFfTWF5bmVfUCA8LSBnZ3NjYXR0ZXIoRGF0YV9QUkVET19FUElDcGxhY2VudGEsIHggPSAiR2VzdGF0aW9uYWxfQWdlIiwgeSA9ICJETkFtR0FfTWF5bmUiLCAKICAgICAgICAgIGFkZCA9ICJyZWcubGluZSIsIGNvbmYuaW50ID0gVFJVRSwgCiAgICAgICAgICBjb3IuY29lZiA9IFRSVUUsIGNvci5tZXRob2QgPSAicGVhcnNvbiIsCiAgICAgICAgICB4bGFiID0gImdlc3RhdGlvbmFsIGFnZSBhdCBzYW1wbGluZyAod2Vla3MpIiwgeWxhYiA9ICJwcmVkaWN0ZWQgZ2VzdGF0aW9uYWwgYWdlIGZyb20gRE5BbSAod2Vla3MpIiwgdGl0bGU9IlBsYWNlbnRhIChFUElDKSIsIHN1YnRpdGxlPSJNYXluZSBjbG9jayIpCgpwbG90UGxhY2VudGFfTWF5bmVfUCA8LSBnZ3Bsb3QoRGF0YV9QUkVET19FUElDcGxhY2VudGEsIGFlcyh4ID1HZXN0YXRpb25hbF9BZ2UsIHkgPUROQW1HQV9NYXluZSkpKyAKICBnZW9tX3BvaW50KHNoYXBlPTEpKwogIHhsYWIoImdlc3RhdGlvbmFsIGFnZSBhdCBzYW1wbGluZyAod2Vla3MpIikrCiAgeWxhYigicHJlZGljdGVkIGdlc3RhdGlvbmFsIGFnZSBmcm9tIEROQW0gKHdlZWtzKSIpKwogIGdlb21fYWJsaW5lKGludGVyY2VwdCA9IDAsIHNsb3BlID0gMSkrCiAgZ2d0aXRsZSgiUGxhY2VudGEgKEVQSUMpIFxuTWF5bmUiKQoKZ3JpZC5hcnJhbmdlKGNvclBsYWNlbnRhX01heW5lX1AsIHBsb3RQbGFjZW50YV9NYXluZV9QLCBuY29sPTIpCgp0aWZmKCJSZXN1bHRzL0ZpZ3VyZXMvY29yRE5BbUdBR0EvRE5BbUdBR0FfY29yX1BsYWNlbnRhX01heW5lX1BSRURPLnRpZmYiLCB1bml0cz0iaW4iLCB3aWR0aD0xMCwgaGVpZ2h0PTUsIHJlcz0zMDApCmNvclBsYWNlbnRhX01heW5lX1AKZGV2Lm9mZigpCgp0aWZmKCJSZXN1bHRzL0ZpZ3VyZXMvY29yRE5BbUdBR0EvRE5BbUdBR0FfcGxvdF9QbGFjZW50YV9NYXluZV9QUkVETy50aWZmIiwgdW5pdHM9ImluIiwgd2lkdGg9MTAsIGhlaWdodD01LCByZXM9MzAwKQpwbG90UGxhY2VudGFfTWF5bmVfUApkZXYub2ZmKCkKYGBgCgoKW3RvIHRoZSB0b3BdKCN0b3ApIAoKCiMjIyBETkFtR0EgR0EgY29ycmVsYXRpb24gcGxvdHMgeyNQbG90Y29yRE5BbUdBR0F9ICAKZm9yIEFkZGl0aW9uYWwgRmlsZSA3CmBgYHtyfQpjb3JfYm9obGluX2l0dSA8LSBnZ3NjYXR0ZXIoRGF0YV9Db3JkX0lUVSwgeCA9ICJHZXN0YXRpb25hbF9BZ2VfV2Vla3MiLCB5ID0gIkROQW1HQV9Cb2hsaW4iLCAKICAgICAgICAgIGFkZCA9ICJyZWcubGluZSIsIGNvbmYuaW50ID0gVFJVRSwgCiAgICAgICAgICMgY29yLmNvZWYgPSBUUlVFLCBjb3IubWV0aG9kID0gInBlYXJzb24iLAogICAgICAgICAgeGxhYiA9ICJHZXN0YXRpb25hbCBBZ2UgKHdlZWtzKSIsIHlsYWIgPSAiRE5BbUdBIEJvaGxpbiAod2Vla3MpIiwgc3VidGl0bGU9IklUVSAobj00MjYpIikrCiAgIHN0YXRfY29yKGxhYmVsLnggPSAyOCwgbGFiZWwueT00MyxwLmFjY3VyYWN5ID0gMC4wMDEsIHIuYWNjdXJhY3kgPSAwLjAxKSsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChzaXplPTkpLCBheGlzLnRleHQueT1lbGVtZW50X3RleHQoc2l6ZT05KSwgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KHNpemU9MTIpLCBheGlzLnRpdGxlLng9ZWxlbWVudF9ibGFuaygpLAogIHBhbmVsLmdyaWQubWFqb3IgPSBlbGVtZW50X2JsYW5rKCksCiAgcGFuZWwuZ3JpZC5taW5vciA9IGVsZW1lbnRfYmxhbmsoKSkrCiAgc2NhbGVfeV9jb250aW51b3VzKGxpbWl0cyA9IGMoMzIsNDQpLCBicmVha3MgPSBzZXEoMzIsNDQsIGJ5PTIpKSsKIHNjYWxlX3hfY29udGludW91cyhsaW1pdHMgPSBjKDI4LDQ0KSwgYnJlYWtzID0gc2VxKDI4LDQ0LCBieT0yKSkKCgpjb3JfYm9obGluX3ByZWRvIDwtIGdnc2NhdHRlcihEYXRhX1BSRURPX0VQSUNjb3JkLCB4ID0gIkdlc3RhdGlvbmFsX0FnZSIsIHkgPSAiRE5BbUdBX0JvaGxpbiIsIAogICAgICAgICAgYWRkID0gInJlZy5saW5lIiwgY29uZi5pbnQgPSBUUlVFLCAKICAgICAgICAgICNjb3IuY29lZiA9IFRSVUUsIGNvci5tZXRob2QgPSAicGVhcnNvbiIsCiAgICAgICAgICB4bGFiID0gIkdlc3RhdGlvbmFsIEFnZSAod2Vla3MpIiwgeWxhYiA9ICJETkFtR0EgQm9obGluIENsb2NrICh3ZWVrcykiLCBzdWJ0aXRsZT0iUFJFRE8gNDUwSyAobj0xNDkpIikrCiAgIHN0YXRfY29yKGxhYmVsLnggPSAzMCwgbGFiZWwueT00MyxwLmFjY3VyYWN5ID0gMC4wMDEsIHIuYWNjdXJhY3kgPSAwLjAxKSsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChzaXplPTkpLCBheGlzLnRleHQueT1lbGVtZW50X3RleHQoc2l6ZT05KSwgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KHNpemU9MTIpLCBheGlzLnRpdGxlLng9ZWxlbWVudF9ibGFuaygpLAogIHBhbmVsLmdyaWQubWFqb3IgPSBlbGVtZW50X2JsYW5rKCksCiAgcGFuZWwuZ3JpZC5taW5vciA9IGVsZW1lbnRfYmxhbmsoKSkgKwogIHNjYWxlX3lfY29udGludW91cyhsaW1pdHMgPSBjKDMyLDQ0KSwgYnJlYWtzID0gc2VxKDMyLDQ0LCBieT0yKSkrCiAgc2NhbGVfeF9jb250aW51b3VzKGxpbWl0cyA9IGMoMzAsNDQpLCBicmVha3MgPSBzZXEoMzAsNDQsIGJ5PTIpKQogIApjb3JfYm9obGluX3ByZWRvXzQ1MGsgPC0gZ2dzY2F0dGVyKERhdGFfUFJFRE9fNDUwS2NvcmQsIHggPSAiR2VzdGF0aW9uYWxfQWdlIiwgeSA9ICJETkFtR0FfQm9obGluIiwgCiAgICAgICAgICBhZGQgPSAicmVnLmxpbmUiLCBjb25mLmludCA9IFRSVUUsIAogICAgICAgICAgI2Nvci5jb2VmID0gVFJVRSwgY29yLm1ldGhvZCA9ICJwZWFyc29uIiwKICAgICAgICAgIHhsYWIgPSAiR2VzdGF0aW9uYWwgQWdlICh3ZWVrcykiLCB5bGFiID0gIkROQW1HQSBCb2hsaW4gQ2xvY2sgKHdlZWtzKSIsIHN1YnRpdGxlPSJQUkVETyBFUElDIChuPTc5MykiKSsKICAgc3RhdF9jb3IobGFiZWwueCA9IDI2LCBsYWJlbC55PTQzLHAuYWNjdXJhY3kgPSAwLjAwMSwgci5hY2N1cmFjeSA9IDAuMDEpKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemU9OSksIGF4aXMudGV4dC55PWVsZW1lbnRfdGV4dChzaXplPTkpLCBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoc2l6ZT0xMiksIGF4aXMudGl0bGUueD1lbGVtZW50X2JsYW5rKCksCiAgcGFuZWwuZ3JpZC5tYWpvciA9IGVsZW1lbnRfYmxhbmsoKSwKICBwYW5lbC5ncmlkLm1pbm9yID0gZWxlbWVudF9ibGFuaygpKSArCiAgc2NhbGVfeV9jb250aW51b3VzKGxpbWl0cyA9IGMoMzIsNDQpLCBicmVha3MgPSBzZXEoMzIsNDQsIGJ5PTIpKSsKICBzY2FsZV94X2NvbnRpbnVvdXMobGltaXRzID0gYygyNiw0NCksIGJyZWFrcyA9IHNlcSgyNiw0NCwgYnk9MikpCgpCb2hsaW5fRE5BbUdBX0dBIDwtIGdnYXJyYW5nZSgKICAgICAgICAgIGNvcl9ib2hsaW5faXR1ICsKICAgICAgICAgICB0aGVtZShwbG90Lm1hcmdpbiA9IG1hcmdpbihyID0gMC4yKSksCiAgICAgICAgICBjb3JfYm9obGluX3ByZWRvICsKICAgICAgICAgICAgICAgdGhlbWUoYXhpcy50ZXh0LnkgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgICAgICAgICAgICAgIGF4aXMudGlja3MueSA9IGVsZW1lbnRfYmxhbmsoKSwgYXhpcy50aXRsZS55ID0gZWxlbWVudF9ibGFuaygpLCBwbG90Lm1hcmdpbiA9IG1hcmdpbihyID0gMC4yLCBsID0gMC4yKSksCiAgICAgICAgICBjb3JfYm9obGluX3ByZWRvXzQ1MGsgKwogICAgICAgICAgICAgICB0aGVtZShheGlzLnRleHQueSA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICAgICAgICAgICAgICAgYXhpcy50aWNrcy55ID0gZWxlbWVudF9ibGFuaygpLCBheGlzLnRpdGxlLnkgPSBlbGVtZW50X2JsYW5rKCksIHBsb3QubWFyZ2luID0gbWFyZ2luKHIgPSAwLjIsIGwgPSAwLjIpKSwKICAgICAgICAgIG5yb3cgPSAxLAogICAgICAgICAgYWxpZ24gPSBjKCJodiIpKQoKIyBBbm5vdGF0ZSB0aGUgZmlndXJlIGJ5IGFkZGluZyBhIGNvbW1vbiBsYWJlbHMKYW5ub3RhdGVfZmlndXJlKEJvaGxpbl9ETkFtR0FfR0EsCiAgICAgICAgICAgICAgICBib3R0b20gPSB0ZXh0X2dyb2IoIkdlc3RhdGlvbmFsIEFnZSAod2Vla3MpIiwgc2l6ZSA9IDEyKSkKCmBgYAoKYGBge3J9CnBuZyhmaWxlPSJSZXN1bHRzL0ZpZ3VyZXMvY29yRE5BbUdBR0EvQm9obGluLnBuZyIsIHdpZHRoPSAzNjAwLCBoZWlnaHQ9MjEwMCwgcmVzPTQ4MCkKYW5ub3RhdGVfZmlndXJlKEJvaGxpbl9ETkFtR0FfR0EsCiAgICAgICAgICAgICAgICBib3R0b20gPSB0ZXh0X2dyb2IoIkdlc3RhdGlvbmFsIEFnZSAod2Vla3MpIiwgc2l6ZSA9IDEyKSkKZGV2Lm9mZigpCmBgYAoKYGBge3J9CmNvcl9rbmlnaHRfaXR1IDwtIGdnc2NhdHRlcihEYXRhX0NvcmRfSVRVLCB4ID0gIkdlc3RhdGlvbmFsX0FnZV9XZWVrcyIsIHkgPSAiRE5BbUdBX0tuaWdodCIsIAogICAgICAgICAgYWRkID0gInJlZy5saW5lIiwgY29uZi5pbnQgPSBUUlVFLCAKICAgICAgICAgIyBjb3IuY29lZiA9IFRSVUUsIGNvci5tZXRob2QgPSAicGVhcnNvbiIsCiAgICAgICAgICB4bGFiID0gIkdlc3RhdGlvbmFsIEFnZSAod2Vla3MpIiwgeWxhYiA9ICJETkFtR0EgS25pZ2h0IENsb2NrICh3ZWVrcykiLCBzdWJ0aXRsZT0iSVRVIChuPTQyNikiKSsKICAgc3RhdF9jb3IobGFiZWwueCA9IDI4LCBsYWJlbC55PTQ4LHAuYWNjdXJhY3kgPSAwLjAwMSwgci5hY2N1cmFjeSA9IDAuMDEpKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemU9OSksIGF4aXMudGV4dC55PWVsZW1lbnRfdGV4dChzaXplPTkpLCBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoc2l6ZT0xMiksIGF4aXMudGl0bGUueD1lbGVtZW50X2JsYW5rKCksCiAgcGFuZWwuZ3JpZC5tYWpvciA9IGVsZW1lbnRfYmxhbmsoKSwKICBwYW5lbC5ncmlkLm1pbm9yID0gZWxlbWVudF9ibGFuaygpKSsKICBzY2FsZV95X2NvbnRpbnVvdXMobGltaXRzID0gYygyOCw0OCksIGJyZWFrcyA9IHNlcSgyOCw0OCwgYnk9MikpKwogc2NhbGVfeF9jb250aW51b3VzKGxpbWl0cyA9IGMoMjgsNDQpLCBicmVha3MgPSBzZXEoMjgsNDQsIGJ5PTIpKQoKCmNvcl9rbmlnaHRfcHJlZG8gPC0gZ2dzY2F0dGVyKERhdGFfUFJFRE9fRVBJQ2NvcmQsIHggPSAiR2VzdGF0aW9uYWxfQWdlIiwgeSA9ICJETkFtR0FfS25pZ2h0IiwgCiAgICAgICAgICBhZGQgPSAicmVnLmxpbmUiLCBjb25mLmludCA9IFRSVUUsIAogICAgICAgICAgI2Nvci5jb2VmID0gVFJVRSwgY29yLm1ldGhvZCA9ICJwZWFyc29uIiwKICAgICAgICAgIHhsYWIgPSAiR2VzdGF0aW9uYWwgQWdlICh3ZWVrcykiLCB5bGFiID0gIkROQW1HQSBLbmlnaHQgQ2xvY2sgKHdlZWtzKSIsIHN1YnRpdGxlPSJQUkVETyBFUElDIChuPTE0OSkiKSsKICAgc3RhdF9jb3IobGFiZWwueCA9IDMwLCBsYWJlbC55PTQ4LHAuYWNjdXJhY3kgPSAwLjAwMSwgci5hY2N1cmFjeSA9IDAuMDEpKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemU9OSksIGF4aXMudGV4dC55PWVsZW1lbnRfdGV4dChzaXplPTkpLCBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoc2l6ZT0xMiksIGF4aXMudGl0bGUueD1lbGVtZW50X2JsYW5rKCksCiAgcGFuZWwuZ3JpZC5tYWpvciA9IGVsZW1lbnRfYmxhbmsoKSwKICBwYW5lbC5ncmlkLm1pbm9yID0gZWxlbWVudF9ibGFuaygpKSArCiAgc2NhbGVfeV9jb250aW51b3VzKGxpbWl0cyA9IGMoMjgsNDgpLCBicmVha3MgPSBzZXEoMjgsNDgsIGJ5PTIpKSsKICBzY2FsZV94X2NvbnRpbnVvdXMobGltaXRzID0gYygzMCw0NCksIGJyZWFrcyA9IHNlcSgzMCw0NCwgYnk9MikpCiAgCmNvcl9rbmlnaHRfcHJlZG9fNDUwayA8LSBnZ3NjYXR0ZXIoRGF0YV9QUkVET180NTBLY29yZCwgeCA9ICJHZXN0YXRpb25hbF9BZ2UiLCB5ID0gIkROQW1HQV9LbmlnaHQiLCAKICAgICAgICAgIGFkZCA9ICJyZWcubGluZSIsIGNvbmYuaW50ID0gVFJVRSwgCiAgICAgICAgICAjY29yLmNvZWYgPSBUUlVFLCBjb3IubWV0aG9kID0gInBlYXJzb24iLAogICAgICAgICAgeGxhYiA9ICJHZXN0YXRpb25hbCBBZ2UgKHdlZWtzKSIsIHlsYWIgPSAiRE5BbUdBIEtuaWdodCBDbG9jayAod2Vla3MpIiwgc3VidGl0bGU9IlBSRURPIDQ1MEsgKG49NzkzKSIpKwogICBzdGF0X2NvcihsYWJlbC54ID0gMjYsIGxhYmVsLnk9NDgscC5hY2N1cmFjeSA9IDAuMDAxLCByLmFjY3VyYWN5ID0gMC4wMSkrCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoc2l6ZT05KSwgYXhpcy50ZXh0Lnk9ZWxlbWVudF90ZXh0KHNpemU9OSksIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChzaXplPTEyKSwgYXhpcy50aXRsZS54PWVsZW1lbnRfYmxhbmsoKSwKICBwYW5lbC5ncmlkLm1ham9yID0gZWxlbWVudF9ibGFuaygpLAogIHBhbmVsLmdyaWQubWlub3IgPSBlbGVtZW50X2JsYW5rKCkpICsKICBzY2FsZV95X2NvbnRpbnVvdXMobGltaXRzID0gYygyOCw0OCksIGJyZWFrcyA9IHNlcSgyOCw0OCwgYnk9MikpKwogIHNjYWxlX3hfY29udGludW91cyhsaW1pdHMgPSBjKDI2LDQ0KSwgYnJlYWtzID0gc2VxKDI2LDQ0LCBieT0yKSkKCktuaWdodF9ETkFtR0FfR0EgPC0gZ2dhcnJhbmdlKAogICAgICAgICAgY29yX2tuaWdodF9pdHUgKwogICAgICAgICAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIsIHBsb3QubWFyZ2luID0gbWFyZ2luKHIgPSAwLjIpICksCiAgICAgICAgICBjb3Jfa25pZ2h0X3ByZWRvICsKICAgICAgICAgICAgICAgdGhlbWUoYXhpcy50ZXh0LnkgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgICAgICAgICAgICAgIGF4aXMudGlja3MueSA9IGVsZW1lbnRfYmxhbmsoKSwgYXhpcy50aXRsZS55ID0gZWxlbWVudF9ibGFuaygpLCBwbG90Lm1hcmdpbiA9IG1hcmdpbihyID0gMC4yLCBsID0gMC4yKSksCiAgICAgICAgICBjb3Jfa25pZ2h0X3ByZWRvXzQ1MGsgKwogICAgICAgICAgICAgICB0aGVtZShheGlzLnRleHQueSA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICAgICAgICAgICAgICAgYXhpcy50aWNrcy55ID0gZWxlbWVudF9ibGFuaygpLCBheGlzLnRpdGxlLnkgPSBlbGVtZW50X2JsYW5rKCksIHBsb3QubWFyZ2luID0gbWFyZ2luKHIgPSAwLjIsIGwgPSAwLjIpKSwKICAgICAgICAgIG5yb3cgPSAxLAogICAgICAgICAgYWxpZ24gPSBjKCJodiIpKQoKIyBBbm5vdGF0ZSB0aGUgZmlndXJlIGJ5IGFkZGluZyBhIGNvbW1vbiBsYWJlbHMKYW5ub3RhdGVfZmlndXJlKEtuaWdodF9ETkFtR0FfR0EsCiAgICAgICAgICAgICAgICBib3R0b20gPSB0ZXh0X2dyb2IoIkdlc3RhdGlvbmFsIEFnZSAod2Vla3MpIiwgc2l6ZSA9IDEyKSkKCmBgYAoKCmBgYHtyfQpwbmcoZmlsZT0iUmVzdWx0cy9GaWd1cmVzL2NvckROQW1HQUdBL0tuaWdodC5wbmciLCB3aWR0aD0gMzYwMCwgaGVpZ2h0PTIxMDAsIHJlcz00ODApCmFubm90YXRlX2ZpZ3VyZShLbmlnaHRfRE5BbUdBX0dBLAogICAgICAgICAgICAgICAgYm90dG9tID0gdGV4dF9ncm9iKCJHZXN0YXRpb25hbCBBZ2UgKHdlZWtzKSIsIHNpemUgPSAxMikpCmRldi5vZmYoKQpgYGAKCmBgYHtyfQpjb3JfbWF5bmVfaXR1X2N2cyA8LSBnZ3NjYXR0ZXIoRGF0YV9DVlNfSVRVLCB4ID0gImdlc3RhZ2VfYXRfQ1ZTX3dlZWtzIiwgeSA9ICJETkFtR0FfTWF5bmUiLCAKICAgICAgICAgIGFkZCA9ICJyZWcubGluZSIsIGNvbmYuaW50ID0gVFJVRSwgCiAgICAgICAgICMgY29yLmNvZWYgPSBUUlVFLCBjb3IubWV0aG9kID0gInBlYXJzb24iLAogICAgICAgICAgeGxhYiA9ICJHZXN0YXRpb25hbCBBZ2UgKHdlZWtzKSIsIHlsYWIgPSAiRE5BbUdBIE1heW5lIENsb2NrICh3ZWVrcykiLCBzdWJ0aXRsZT0iSVRVIENWUyAobj0yNjQpIikrCiAgIHN0YXRfY29yKGxhYmVsLnggPSAxMCwgbGFiZWwueT0yMCxwLmFjY3VyYWN5ID0gMC4wMDEsIHIuYWNjdXJhY3kgPSAwLjAxKSsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChzaXplPTkpLCBheGlzLnRleHQueT1lbGVtZW50X3RleHQoc2l6ZT05KSwgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KHNpemU9MTIpLCBheGlzLnRpdGxlLng9ZWxlbWVudF90ZXh0KHNpemU9MTIpLAogIHBhbmVsLmdyaWQubWFqb3IgPSBlbGVtZW50X2JsYW5rKCksCiAgcGFuZWwuZ3JpZC5taW5vciA9IGVsZW1lbnRfYmxhbmsoKSkrCiAgc2NhbGVfeV9jb250aW51b3VzKGxpbWl0cyA9IGMoNCwyMCksIGJyZWFrcyA9IHNlcSg0LDIwLCBieT0yKSkrCiBzY2FsZV94X2NvbnRpbnVvdXMobGltaXRzID0gYygxMCwxNiksIGJyZWFrcyA9IHNlcSgxMCwxNiwgYnk9MikpCgoKY29yX21heW5lX2l0dSA8LSBnZ3NjYXR0ZXIoRGF0YV9QbGFjZW50YV9JVFUsIHggPSAiR2VzdGF0aW9uYWxfQWdlX1dlZWtzIiwgeSA9ICJETkFtR0FfTWF5bmUiLCAKICAgICAgICAgIGFkZCA9ICJyZWcubGluZSIsIGNvbmYuaW50ID0gVFJVRSwgCiAgICAgICAgICAjY29yLmNvZWYgPSBUUlVFLCBjb3IubWV0aG9kID0gInBlYXJzb24iLAogICAgICAgICAgeGxhYiA9ICJHZXN0YXRpb25hbCBBZ2UgKHdlZWtzKSIsIHlsYWIgPSAiRE5BbUdBIE1heW5lIENsb2NrICh3ZWVrcykiLCBzdWJ0aXRsZT0iSVRVIChuPTQ4NikiKSsKICAgc3RhdF9jb3IobGFiZWwueCA9IDI4LCBsYWJlbC55PTM4LHAuYWNjdXJhY3kgPSAwLjAwMSwgci5hY2N1cmFjeSA9IDAuMDEpKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemU9OSksIGF4aXMudGV4dC55PWVsZW1lbnRfdGV4dChzaXplPTkpLCBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoc2l6ZT0xMiksIGF4aXMudGl0bGUueD1lbGVtZW50X2JsYW5rKCksCiAgcGFuZWwuZ3JpZC5tYWpvciA9IGVsZW1lbnRfYmxhbmsoKSwKICBwYW5lbC5ncmlkLm1pbm9yID0gZWxlbWVudF9ibGFuaygpKSArCiAgc2NhbGVfeV9jb250aW51b3VzKGxpbWl0cyA9IGMoMjUsMzgpLCBicmVha3MgPSBzZXEoMjYsMzgsIGJ5PTIpKSsKICBzY2FsZV94X2NvbnRpbnVvdXMobGltaXRzID0gYygyOCw0NCksIGJyZWFrcyA9IHNlcSgyOCw0NCwgYnk9MikpCiAgCmNvcl9tYXluZV9wcmVkbyA8LSBnZ3NjYXR0ZXIoRGF0YV9QUkVET19FUElDcGxhY2VudGEsIHggPSAiR2VzdGF0aW9uYWxfQWdlIiwgeSA9ICJETkFtR0FfTWF5bmUiLCAKICAgICAgICAgIGFkZCA9ICJyZWcubGluZSIsIGNvbmYuaW50ID0gVFJVRSwgCiAgICAgICAgICAjY29yLmNvZWYgPSBUUlVFLCBjb3IubWV0aG9kID0gInBlYXJzb24iLAogICAgICAgICAgeGxhYiA9ICJHZXN0YXRpb25hbCBBZ2UgKHdlZWtzKSIsIHlsYWIgPSAiRE5BbUdBIE1heW5lIENsb2NrICh3ZWVrcykiLCBzdWJ0aXRsZT0iUFJFRE8gKG49MTM5KSIpKwogICBzdGF0X2NvcihsYWJlbC54ID0gMzIsIGxhYmVsLnk9MzgscC5hY2N1cmFjeSA9IDAuMDAxLCByLmFjY3VyYWN5ID0gMC4wMSkrCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoc2l6ZT05KSwgYXhpcy50ZXh0Lnk9ZWxlbWVudF90ZXh0KHNpemU9OSksIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChzaXplPTEyKSwgYXhpcy50aXRsZS54PWVsZW1lbnRfYmxhbmsoKSwKICBwYW5lbC5ncmlkLm1ham9yID0gZWxlbWVudF9ibGFuaygpLAogIHBhbmVsLmdyaWQubWlub3IgPSBlbGVtZW50X2JsYW5rKCkpICsKICBzY2FsZV95X2NvbnRpbnVvdXMobGltaXRzID0gYygyNSwzOCksIGJyZWFrcyA9IHNlcSgyNiwzOCwgYnk9MikpKwogIHNjYWxlX3hfY29udGludW91cyhsaW1pdHMgPSBjKDMyLDQ0KSwgYnJlYWtzID0gc2VxKDMyLDQ0LCBieT0yKSkKCk1heW5lX0ROQW1HQV9HQSA8LSBnZ2FycmFuZ2UoCiAgICAgICAgICBjb3JfbWF5bmVfaXR1ICsKICAgICAgICAgICB0aGVtZShsZWdlbmQucG9zaXRpb249Im5vbmUiLCBwbG90Lm1hcmdpbiA9IG1hcmdpbihyID0gMC4yKSApLAogICAgICAgICAgY29yX21heW5lX3ByZWRvICsKICAgICAgICAgICAgICAgdGhlbWUoYXhpcy50ZXh0LnkgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgICAgICAgICAgICAgIGF4aXMudGlja3MueSA9IGVsZW1lbnRfYmxhbmsoKSwgYXhpcy50aXRsZS55ID0gZWxlbWVudF9ibGFuaygpLCBwbG90Lm1hcmdpbiA9IG1hcmdpbihyID0gMC4yLCBsID0gMC4yKSksCiAgICAgICAgICBucm93ID0gMSwKICAgICAgICAgIGFsaWduID0gYygiaHYiKSkKCiMgQW5ub3RhdGUgdGhlIGZpZ3VyZSBieSBhZGRpbmcgYSBjb21tb24gbGFiZWxzCmFubm90YXRlX2ZpZ3VyZShNYXluZV9ETkFtR0FfR0EsCiAgICAgICAgICAgICAgICBib3R0b20gPSB0ZXh0X2dyb2IoIkdlc3RhdGlvbmFsIEFnZSAod2Vla3MpIiwgc2l6ZSA9IDEyKSkKCmBgYAoKCmBgYHtyfQpwbmcoZmlsZT0iUmVzdWx0cy9GaWd1cmVzL2NvckROQW1HQUdBL01heW5lLnBuZyIsIHdpZHRoPSAyNDAwLCBoZWlnaHQ9MjEwMCwgcmVzPTQ4MCkKYW5ub3RhdGVfZmlndXJlKE1heW5lX0ROQW1HQV9HQSwKICAgICAgICAgICAgICAgIGJvdHRvbSA9IHRleHRfZ3JvYigiR2VzdGF0aW9uYWwgQWdlICh3ZWVrcykiLCBzaXplID0gMTIpKQpkZXYub2ZmKCkKCnBuZyhmaWxlPSJSZXN1bHRzL0ZpZ3VyZXMvY29yRE5BbUdBR0EvTWF5bmVfQ1ZTLnBuZyIsIHdpZHRoPSA4MDAsIGhlaWdodD0xNDAwLCByZXM9MzIwKQpjb3JfbWF5bmVfaXR1X2N2cwpkZXYub2ZmKCkKYGBgCgpgYGB7cn0KY29yX2xlZV9pdHVfY3ZzIDwtIGdnc2NhdHRlcihEYXRhX0NWU19JVFUsIHggPSAiZ2VzdGFnZV9hdF9DVlNfd2Vla3MiLCB5ID0gIkROQW1HQV9MZWUiLCAKICAgICAgICAgIGFkZCA9ICJyZWcubGluZSIsIGNvbmYuaW50ID0gVFJVRSwgCiAgICAgICAgICMgY29yLmNvZWYgPSBUUlVFLCBjb3IubWV0aG9kID0gInBlYXJzb24iLAogICAgICAgICAgeGxhYiA9ICJHZXN0YXRpb25hbCBBZ2UgKHdlZWtzKSIsIHlsYWIgPSAiRE5BbUdBIExlZSBDbG9jayAod2Vla3MpIiwgc3VidGl0bGU9IklUVSBDVlMgKG49MjY0KSIpKwogICBzdGF0X2NvcihsYWJlbC54ID0gMTAsIGxhYmVsLnk9MjAscC5hY2N1cmFjeSA9IDAuMDAxLCByLmFjY3VyYWN5ID0gMC4wMSkrCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoc2l6ZT05KSwgYXhpcy50ZXh0Lnk9ZWxlbWVudF90ZXh0KHNpemU9OSksIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChzaXplPTEyKSwgYXhpcy50aXRsZS54PWVsZW1lbnRfdGV4dChzaXplPTEyKSwKICBwYW5lbC5ncmlkLm1ham9yID0gZWxlbWVudF9ibGFuaygpLAogIHBhbmVsLmdyaWQubWlub3IgPSBlbGVtZW50X2JsYW5rKCkpKwogIHNjYWxlX3lfY29udGludW91cyhsaW1pdHMgPSBjKDQsMjApLCBicmVha3MgPSBzZXEoNCwyMCwgYnk9MikpKwogc2NhbGVfeF9jb250aW51b3VzKGxpbWl0cyA9IGMoMTAsMTYpLCBicmVha3MgPSBzZXEoMTAsMTYsIGJ5PTIpKQoKCmNvcl9sZWVfaXR1IDwtIGdnc2NhdHRlcihEYXRhX1BsYWNlbnRhX0lUVSwgeCA9ICJHZXN0YXRpb25hbF9BZ2VfV2Vla3MiLCB5ID0gIkROQW1HQV9MZWUiLCAKICAgICAgICAgIGFkZCA9ICJyZWcubGluZSIsIGNvbmYuaW50ID0gVFJVRSwgCiAgICAgICAgICAjY29yLmNvZWYgPSBUUlVFLCBjb3IubWV0aG9kID0gInBlYXJzb24iLAogICAgICAgICAgeGxhYiA9ICJHZXN0YXRpb25hbCBBZ2UgKHdlZWtzKSIsIHlsYWIgPSAiRE5BbUdBIExlZSBDbG9jayAod2Vla3MpIiwgc3VidGl0bGU9IklUVSAobj00ODYpIikrCiAgIHN0YXRfY29yKGxhYmVsLnggPSAyOCwgbGFiZWwueT00NCxwLmFjY3VyYWN5ID0gMC4wMDEsIHIuYWNjdXJhY3kgPSAwLjAxKSsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChzaXplPTkpLCBheGlzLnRleHQueT1lbGVtZW50X3RleHQoc2l6ZT05KSwgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KHNpemU9MTIpLCBheGlzLnRpdGxlLng9ZWxlbWVudF9ibGFuaygpLAogIHBhbmVsLmdyaWQubWFqb3IgPSBlbGVtZW50X2JsYW5rKCksCiAgcGFuZWwuZ3JpZC5taW5vciA9IGVsZW1lbnRfYmxhbmsoKSkgKwogIHNjYWxlX3lfY29udGludW91cyhsaW1pdHMgPSBjKDMwLDQ0KSwgYnJlYWtzID0gc2VxKDMwLDQ0LCBieT0yKSkrCiAgc2NhbGVfeF9jb250aW51b3VzKGxpbWl0cyA9IGMoMjgsNDQpLCBicmVha3MgPSBzZXEoMjgsNDQsIGJ5PTIpKQogIApjb3JfbGVlX3ByZWRvIDwtIGdnc2NhdHRlcihEYXRhX1BSRURPX0VQSUNwbGFjZW50YSwgeCA9ICJHZXN0YXRpb25hbF9BZ2UiLCB5ID0gIkROQW1HQV9MZWUiLCAKICAgICAgICAgIGFkZCA9ICJyZWcubGluZSIsIGNvbmYuaW50ID0gVFJVRSwgCiAgICAgICAgICAjY29yLmNvZWYgPSBUUlVFLCBjb3IubWV0aG9kID0gInBlYXJzb24iLAogICAgICAgICAgeGxhYiA9ICJHZXN0YXRpb25hbCBBZ2UgKHdlZWtzKSIsIHlsYWIgPSAiRE5BbUdBIExlZSBDbG9jayAod2Vla3MpIiwgc3VidGl0bGU9IlBSRURPIChuPTEzOSkiKSsKICAgc3RhdF9jb3IobGFiZWwueCA9IDMyLCBsYWJlbC55PTQ0LHAuYWNjdXJhY3kgPSAwLjAwMSwgci5hY2N1cmFjeSA9IDAuMDEpKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemU9OSksIGF4aXMudGV4dC55PWVsZW1lbnRfdGV4dChzaXplPTkpLCBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoc2l6ZT0xMiksIGF4aXMudGl0bGUueD1lbGVtZW50X2JsYW5rKCksCiAgcGFuZWwuZ3JpZC5tYWpvciA9IGVsZW1lbnRfYmxhbmsoKSwKICBwYW5lbC5ncmlkLm1pbm9yID0gZWxlbWVudF9ibGFuaygpKSArCiAgc2NhbGVfeV9jb250aW51b3VzKGxpbWl0cyA9IGMoMzAsNDQpLCBicmVha3MgPSBzZXEoMzAsNDQsIGJ5PTIpKSsKICBzY2FsZV94X2NvbnRpbnVvdXMobGltaXRzID0gYygzMiw0NCksIGJyZWFrcyA9IHNlcSgzMiw0NCwgYnk9MikpCgpMZWVfRE5BbUdBX0dBIDwtIGdnYXJyYW5nZSgKICAgICAgICAgIGNvcl9sZWVfaXR1ICsKICAgICAgICAgICB0aGVtZShsZWdlbmQucG9zaXRpb249Im5vbmUiLCBwbG90Lm1hcmdpbiA9IG1hcmdpbihyID0gMC4yKSApLAogICAgICAgICAgY29yX2xlZV9wcmVkbyArCiAgICAgICAgICAgICAgIHRoZW1lKGF4aXMudGV4dC55ID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgICAgICAgICAgICAgICBheGlzLnRpY2tzLnkgPSBlbGVtZW50X2JsYW5rKCksIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfYmxhbmsoKSwgcGxvdC5tYXJnaW4gPSBtYXJnaW4ociA9IDAuMiwgbCA9IDAuMikpLAogICAgICAgICAgbnJvdyA9IDEsCiAgICAgICAgICBhbGlnbiA9IGMoImh2IikpCgojIEFubm90YXRlIHRoZSBmaWd1cmUgYnkgYWRkaW5nIGEgY29tbW9uIGxhYmVscwphbm5vdGF0ZV9maWd1cmUoTGVlX0ROQW1HQV9HQSwKICAgICAgICAgICAgICAgIGJvdHRvbSA9IHRleHRfZ3JvYigiR2VzdGF0aW9uYWwgQWdlICh3ZWVrcykiLCBzaXplID0gMTIpKQoKYGBgCgpgYGB7cn0KcG5nKGZpbGU9IlJlc3VsdHMvRmlndXJlcy9jb3JETkFtR0FHQS9MZWUucG5nIiwgd2lkdGg9IDI0MDAsIGhlaWdodD0yMTAwLCByZXM9NDgwKQphbm5vdGF0ZV9maWd1cmUoTGVlX0ROQW1HQV9HQSwKICAgICAgICAgICAgICAgIGJvdHRvbSA9IHRleHRfZ3JvYigiR2VzdGF0aW9uYWwgQWdlICh3ZWVrcykiLCBzaXplID0gMTIpKQpkZXYub2ZmKCkKCnBuZyhmaWxlPSJSZXN1bHRzL0ZpZ3VyZXMvY29yRE5BbUdBR0EvTGVlX0NWUy5wbmciLCB3aWR0aD0gODAwLCBoZWlnaHQ9MTQwMCwgcmVzPTMyMCkKY29yX2xlZV9pdHVfY3ZzCmRldi5vZmYoKQpgYGAKCiMgQ29ycmVsYXRpb24gQ2xvY2tzCiMjIGNvcnJlbGF0aW9uIGNvcmRibG9vZCBjbG9ja3MgeyNjb3JDb3JkQ2xvY2tzfSAgCgoKYGBge3J9CmlmZWxzZSghZGlyLmV4aXN0cyhmaWxlLnBhdGgoZ2V0d2QoKSwgIlJlc3VsdHMvRmlndXJlcy9jb3JDbG9ja3MiKSksIGRpci5jcmVhdGUoZmlsZS5wYXRoKGdldHdkKCksICJSZXN1bHRzL0ZpZ3VyZXMvY29yQ2xvY2tzIikpLCBGQUxTRSkKYGBgCgoKYGBge3J9CmNvcl9jb3JkX2Nsb2Nrc19pdHUgPC0gCiAgZ2dzY2F0dGVyKERhdGFfQ29yZF9JVFUsIHggPSAiRE5BbUdBX0tuaWdodCIsIHkgPSAiRE5BbUdBX0JvaGxpbiIsIAogICAgICAgICAgYWRkID0gInJlZy5saW5lIiwgY29uZi5pbnQgPSBUUlVFLCAKICAgICAgICAgICNjb3IuY29lZiA9IFRSVUUsIGNvci5tZXRob2QgPSAicGVhcnNvbiIsCiAgICAgICAgICB4bGFiID0gIkROQW1HQSBlc3RpbWF0ZWQgYnkgdGhlIEtuaWdodCBDbG9jayIsIHlsYWIgPSAiRE5BbUdBIGVzdGltYXRlZCBieSB0aGUgQm9obGluIENsb2NrICh3ZWVrcykiLCBzdWJ0aXRsZT0iSVRVIChuPTQyNikiKSsKICAgc3RhdF9jb3IobGFiZWwueCA9IDMwLCBsYWJlbC55PTQzLHAuYWNjdXJhY3kgPSAwLjAwMSwgci5hY2N1cmFjeSA9IDAuMDEpKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemU9OSksIGF4aXMudGV4dC55PWVsZW1lbnRfdGV4dChzaXplPTkpLCBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoc2l6ZT0xMiksIGF4aXMudGl0bGUueD1lbGVtZW50X2JsYW5rKCksCiAgcGFuZWwuZ3JpZC5tYWpvciA9IGVsZW1lbnRfYmxhbmsoKSwKICBwYW5lbC5ncmlkLm1pbm9yID0gZWxlbWVudF9ibGFuaygpKSArCiAgc2NhbGVfeV9jb250aW51b3VzKGxpbWl0cyA9IGMoMzIsNDQpLCBicmVha3MgPSBzZXEoMzIsIDQ0LCBieT0yKSkrCiAgc2NhbGVfeF9jb250aW51b3VzKGxpbWl0cyA9IGMoMzAsNDQpLCBicmVha3MgPSBzZXEoMzAsIDQ0LCBieT0yKSkKICAjY29vcmRfY2FydGVzaWFuKHlsaW0gPSBjKDMyLDQzKSkKCmNvcl9jb3JkX2Nsb2Nrc19wcmVkbyA8LWdnc2NhdHRlcihEYXRhX1BSRURPX0VQSUNjb3JkLCB4ID0gIkROQW1HQV9LbmlnaHQiLCB5ID0gIkROQW1HQV9Cb2hsaW4iLCAKICAgICAgICAgIGFkZCA9ICJyZWcubGluZSIsIGNvbmYuaW50ID0gVFJVRSwgCiAgICAgICAgICAjY29yLmNvZWYgPSBUUlVFLCBjb3IubWV0aG9kID0gInBlYXJzb24iLAogICAgICAgICAgeGxhYiA9ICJETkFtR0EgZXN0aW1hdGVkIGJ5IHRoZSBLbmlnaHQgQ2xvY2siLCB5bGFiID0gIkROQW1HQSBlc3RpbWF0ZWQgYnkgdGhlIEJvaGxpbiBDbG9jayIsIHN1YnRpdGxlPSJQUkVETyBFUElDIChuPTE0OSkiKSsKICAgc3RhdF9jb3IobGFiZWwueCA9IDMwLGxhYmVsLnk9NDMsIHAuYWNjdXJhY3kgPSAwLjAwMSwgci5hY2N1cmFjeSA9IDAuMDEpKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemU9OSksIGF4aXMudGV4dC55PWVsZW1lbnRfdGV4dChzaXplPTkpLCBheGlzLnRpdGxlLnkgPSBlbGVtZW50X2JsYW5rKCksIGF4aXMudGl0bGUueD1lbGVtZW50X2JsYW5rKCksCiAgcGFuZWwuZ3JpZC5tYWpvciA9IGVsZW1lbnRfYmxhbmsoKSwKICBwYW5lbC5ncmlkLm1pbm9yID0gZWxlbWVudF9ibGFuaygpKSArCiAgc2NhbGVfeV9jb250aW51b3VzKGxpbWl0cyA9IGMoMzIsNDQpLCBicmVha3MgPSBzZXEoMzIsIDQ0LCBieT0yKSkrCiAgc2NhbGVfeF9jb250aW51b3VzKGxpbWl0cyA9IGMoMzAsNDQpLCBicmVha3MgPSBzZXEoMzAsIDQ0LCBieT0yKSkKICMgY29vcmRfY2FydGVzaWFuKHlsaW0gPSBjKDMyLDQzKSkKCmNvcl9jb3JkX2Nsb2Nrc19wcmVkb180NTBrIDwtIGdnc2NhdHRlcihEYXRhX1BSRURPXzQ1MEtjb3JkLCB4ID0gIkROQW1HQV9LbmlnaHQiLCB5ID0gIkROQW1HQV9Cb2hsaW4iLAogICAgICAgICAgYWRkID0gInJlZy5saW5lIiwgY29uZi5pbnQgPSBUUlVFLCAKICAgICAgICAgIyBjb3IuY29lZiA9IFRSVUUsIGNvci5tZXRob2QgPSAicGVhcnNvbiIsCiAgICAgICAgICB4bGFiID0gIkROQW1HQSBlc3RpbWF0ZWQgYnkgdGhlIEtuaWdodCBDbG9jayIsIHlsYWIgPSAiRE5BbUdBIGVzdGltYXRlZCBieSB0aGUgQm9obGluIENsb2NrIiwgc3VidGl0bGU9IlBSRURPIDQ1MEsgKG49Nzk1KSIpKwogICBzdGF0X2NvcihsYWJlbC54ID0gMzAsIGxhYmVsLnk9NDMscC5hY2N1cmFjeSA9IDAuMDAxLCByLmFjY3VyYWN5ID0gMC4wMSkrCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoc2l6ZT05KSwgYXhpcy50ZXh0Lnk9ZWxlbWVudF90ZXh0KHNpemU9OSksIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfYmxhbmsoKSwgYXhpcy50aXRsZS54PWVsZW1lbnRfYmxhbmsoKSwgbGVnZW5kLnRpdGxlID0gZWxlbWVudF9ibGFuaygpLAogIHBhbmVsLmdyaWQubWFqb3IgPSBlbGVtZW50X2JsYW5rKCksCiAgcGFuZWwuZ3JpZC5taW5vciA9IGVsZW1lbnRfYmxhbmsoKSkgKwogIHNjYWxlX3lfY29udGludW91cyhsaW1pdHMgPSBjKDMyLDQ0KSwgYnJlYWtzID0gc2VxKDMyLCA0NCwgYnk9MikpKwogIHNjYWxlX3hfY29udGludW91cyhicmVha3MgPSBzZXEoMzAsIDQ0LCBieT0yKSkKICMgY29vcmRfY2FydGVzaWFuKHlsaW0gPSBjKDMyLDQzKSkKCiNnZ2FycmFuZ2UoZ3JvYnM9Y29yX2NvcmRfY2xvY2tzX2l0dSwgY29yX2NvcmRfY2xvY2tzX3ByZWRvLCBjb3JfY29yZF9jbG9ja3NfcHJlZG9fNDUwaywgbnJvdz0xLCBhbGlnbj1jKCJodiIpLCB0b3A9IkNvcnJlbGF0aW9uIENvcmQgYmxvb2QgQ2xvY2tzIikKCmNsb2NrX2NvcmRfY29yX2dnIDwtIGdnYXJyYW5nZSgKICAgICAgICAgIGNvcl9jb3JkX2Nsb2Nrc19pdHUgKwogICAgICAgICAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIsIHBsb3QubWFyZ2luID0gbWFyZ2luKHIgPSAwLjIpICksCiAgICAgICAgICBjb3JfY29yZF9jbG9ja3NfcHJlZG8gKwogICAgICAgICAgICAgICB0aGVtZShheGlzLnRleHQueSA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICAgICAgICAgICAgICAgYXhpcy50aWNrcy55ID0gZWxlbWVudF9ibGFuaygpLCBheGlzLnRpdGxlLnkgPSBlbGVtZW50X2JsYW5rKCksIHBsb3QubWFyZ2luID0gbWFyZ2luKHIgPSAwLjIsIGwgPSAwLjIpKSwKICAgICAgICAgIGNvcl9jb3JkX2Nsb2Nrc19wcmVkb180NTBrICsKICAgICAgICAgICAgICAgdGhlbWUoYXhpcy50ZXh0LnkgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgICAgICAgICAgICAgIGF4aXMudGlja3MueSA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICAgICAgICAgICAgICAgcGxvdC5tYXJnaW4gPSBtYXJnaW4obCA9IDAuMikpLAogICAgICAgICAgbnJvdyA9IDEsCiAgICAgICAgICBhbGlnbiA9IGMoImh2IikpCgojIEFubm90YXRlIHRoZSBmaWd1cmUgYnkgYWRkaW5nIGEgY29tbW9uIGxhYmVscwpjb3JfY2xvY2tfY29yIDwtIGFubm90YXRlX2ZpZ3VyZShjbG9ja19jb3JkX2Nvcl9nZywKICAgICAgICAgICAgICAgIGJvdHRvbSA9IHRleHRfZ3JvYigiRE5BbUdBIGVzdGltYXRlZCBieSB0aGUgS25pZ2h0IENsb2NrICh3ZWVrcykiLCBzaXplID0gMTIpLCB0b3AgPSB0ZXh0X2dyb2IoIkNvcnJlbGF0aW9uIENvcmQgYmxvb2QgQ2xvY2tzIFxuIiwgc2l6ZSA9IDE0KSkKYGBgCgpgYGB7cn0KcG5nKGZpbGU9IlJlc3VsdHMvRmlndXJlcy9jb3JDbG9ja3MvY29yZC5wbmciLCB3aWR0aD0gMzYwMCwgaGVpZ2h0PTIxMDAsIHJlcz00ODApCmFubm90YXRlX2ZpZ3VyZShjbG9ja19jb3JkX2Nvcl9nZywKICAgICAgICAgICAgICAgIGJvdHRvbSA9IHRleHRfZ3JvYigiRE5BbUdBIGVzdGltYXRlZCBieSB0aGUgS25pZ2h0IENsb2NrICh3ZWVrcykiLCBzaXplID0gMTIpKQpkZXYub2ZmKCkKYGBgCgpbdG8gdGhlIHRvcF0oI3RvcCkgIAoKIyMgY29ycmVsYXRpb24gcGxhY2VudGEgY2xvY2tzIHsjY29yUGxhY2VudGFDbG9ja3N9ICAKCmBgYHtyfQpjb3JfcGxhY2VudGFfY2xvY2tzX2l0dSA8LSBnZ3NjYXR0ZXIoRGF0YV9QbGFjZW50YV9JVFUsIHggPSAiRE5BbUdBX01heW5lIiwgeSA9ICJETkFtR0FfTGVlIiwgCiAgICAgICAgICBhZGQgPSAicmVnLmxpbmUiLCBjb25mLmludCA9IFRSVUUsIAogICAgICAgICAjIGNvci5jb2VmID0gVFJVRSwgY29yLm1ldGhvZCA9ICJwZWFyc29uIiwKICAgICAgICAgIHhsYWIgPSAiRE5BbUdBIGVzdGltYXRlZCBieSB0aGUgTWF5bmUgQ2xvY2siLCB5bGFiID0gIkROQW1HQSBlc3RpbWF0ZWQgYnkgdGhlIExlZSBDbG9jayAod2Vla3MpIiwgc3VidGl0bGU9IklUVSAobj00ODYpIikrCiAgIHN0YXRfY29yKGxhYmVsLnggPSAyNSwgbGFiZWwueT00MyxwLmFjY3VyYWN5ID0gMC4wMDEsIHIuYWNjdXJhY3kgPSAwLjAxKSsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChzaXplPTkpLCBheGlzLnRleHQueT1lbGVtZW50X3RleHQoc2l6ZT05KSwgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KHNpemU9MTIpLCBheGlzLnRpdGxlLng9ZWxlbWVudF9ibGFuaygpLAogIHBhbmVsLmdyaWQubWFqb3IgPSBlbGVtZW50X2JsYW5rKCksCiAgcGFuZWwuZ3JpZC5taW5vciA9IGVsZW1lbnRfYmxhbmsoKSkgKwogIHNjYWxlX3lfY29udGludW91cyhsaW1pdHMgPSBjKDMwLDQ0KSwgYnJlYWtzID0gc2VxKDMwLDQ0LCBieT0yKSkrCiAgc2NhbGVfeF9jb250aW51b3VzKGxpbWl0cyA9IGMoMjUsNDApLCBicmVha3MgPSBzZXEoMjYsNDAsIGJ5PTIpKQoKCmNvcl9wbGFjZW50YV9jbG9ja3NfcHJlZG8gPC0gZ2dzY2F0dGVyKERhdGFfUFJFRE9fRVBJQ3BsYWNlbnRhLCB4ID0gIkROQW1HQV9NYXluZSIsIHkgPSAiRE5BbUdBX0xlZSIsIAogICAgICAgICAgYWRkID0gInJlZy5saW5lIiwgY29uZi5pbnQgPSBUUlVFLCAKICAgICAgICAgICNjb3IuY29lZiA9IFRSVUUsIGNvci5tZXRob2QgPSAicGVhcnNvbiIsCiAgICAgICAgICB4bGFiID0gIkROQW1HQSBlc3RpbWF0ZWQgYnkgdGhlIExlZSBDbG9jayIsIHlsYWIgPSAiRE5BbUdBIGVzdGltYXRlZCBieSB0aGUgTWF5bmUgQ2xvY2siLCBzdWJ0aXRsZT0iUFJFRE8gKG49MTM5KSIpKwogICBzdGF0X2NvcihsYWJlbC54ID0gMjYsIGxhYmVsLnk9NDMscC5hY2N1cmFjeSA9IDAuMDAxLCByLmFjY3VyYWN5ID0gMC4wMSkrCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoc2l6ZT05KSwgYXhpcy50ZXh0Lnk9ZWxlbWVudF90ZXh0KHNpemU9OSksIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChzaXplPTEyKSwgYXhpcy50aXRsZS54PWVsZW1lbnRfYmxhbmsoKSwKICBwYW5lbC5ncmlkLm1ham9yID0gZWxlbWVudF9ibGFuaygpLAogIHBhbmVsLmdyaWQubWlub3IgPSBlbGVtZW50X2JsYW5rKCkpICsKICBzY2FsZV95X2NvbnRpbnVvdXMobGltaXRzID0gYygzMCw0NCksIGJyZWFrcyA9IHNlcSgzMCw0NCwgYnk9MikpKwogIHNjYWxlX3hfY29udGludW91cyhsaW1pdHMgPSBjKDI2LDM2KSwgYnJlYWtzID0gc2VxKDI2LDM2LCBieT0yKSkKCmNsb2NrX3BsYWNlbnRhX2Nvcl9nZyA8LSBnZ2FycmFuZ2UoCiAgICAgICAgICBjb3JfcGxhY2VudGFfY2xvY2tzX2l0dSArCiAgICAgICAgICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uPSJub25lIiwgcGxvdC5tYXJnaW4gPSBtYXJnaW4ociA9IDAuMikgKSwKICAgICAgICAgIGNvcl9wbGFjZW50YV9jbG9ja3NfcHJlZG8gKwogICAgICAgICAgICAgICB0aGVtZShheGlzLnRleHQueSA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICAgICAgICAgICAgICAgYXhpcy50aWNrcy55ID0gZWxlbWVudF9ibGFuaygpLCBheGlzLnRpdGxlLnkgPSBlbGVtZW50X2JsYW5rKCksIHBsb3QubWFyZ2luID0gbWFyZ2luKHIgPSAwLjIsIGwgPSAwLjIpKSwKICAgICAgICAgIG5yb3cgPSAxLAogICAgICAgICAgYWxpZ24gPSBjKCJodiIpKQoKIyBBbm5vdGF0ZSB0aGUgZmlndXJlIGJ5IGFkZGluZyBhIGNvbW1vbiBsYWJlbHMKcGxhX2Nsb2NrX2NvciA8LSBhbm5vdGF0ZV9maWd1cmUoY2xvY2tfcGxhY2VudGFfY29yX2dnLAogICAgICAgICAgICAgICAgYm90dG9tID0gdGV4dF9ncm9iKCJETkFtR0EgZXN0aW1hdGVkIGJ5IHRoZSBNYXluZSBDbG9jayAod2Vla3MpIiwgc2l6ZSA9IDEyKSwgdG9wID0gdGV4dF9ncm9iKCJDb3JyZWxhdGlvbiBQbGFjZW50YSBDbG9ja3MgXG4iLCBzaXplID0gMTQpKQoKYGBgCgpgYGB7cn0KcG5nKGZpbGU9IlJlc3VsdHMvRmlndXJlcy9jb3JDbG9ja3MvcGxhY2VudGEucG5nIiwgd2lkdGg9IDI0MDAsIGhlaWdodD0xNDAwLCByZXM9MzIwKQphbm5vdGF0ZV9maWd1cmUoY2xvY2tfcGxhY2VudGFfY29yX2dnLAogICAgICAgICAgICAgICAgYm90dG9tID0gdGV4dF9ncm9iKCJETkFtR0EgZXN0aW1hdGVkIGJ5IHRoZSBNYXluZSBDbG9jayAod2Vla3MpIiwgc2l6ZSA9IDEyKSkKZGV2Lm9mZigpCmBgYAoKYGBge3J9Cmdnc2NhdHRlcihEYXRhX0NWU19JVFUsIHggPSAiR2VzdGF0aW9uYWxfQWdlX1dlZWtzIiwgeSA9ICJkZWx0YV9MZWUiLCAKICAgICAgICAgIGFkZCA9ICJyZWcubGluZSIsIGNvbmYuaW50ID0gVFJVRSwgCiAgICAgICAgICBjb3IuY29lZiA9IFRSVUUsIGNvci5tZXRob2QgPSAicGVhcnNvbiIsCiAgICAgICAgICB4bGFiID0gImdlc3RhdGlvbmFsIGFnZSAod2Vla3MpIiwgeWxhYiA9ICJkZWx0YSBMZWUiLCB0aXRsZT0iQ29ycmVsYXRpb24gQ1ZTIGdlc3RhdGlvbmFsIGFnZSBkZXZpYW5jZSAoSVRVKSIpCmBgYAoKW3RvIHRoZSB0b3BdKCN0b3ApCgojIEVBQVIgRGVzY3JpcHRpdmUKIyMgSVRVOiBWaXN1YWxpemF0aW9uIEVBQVIgeyNwbG90c0VBQVJJVFV9ICAKCgpgYGB7cn0KaWZlbHNlKCFkaXIuZXhpc3RzKGZpbGUucGF0aChnZXR3ZCgpLCAiUmVzdWx0cy9GaWd1cmVzL0VBQVJfZGVzY3JpcHRpdmUiKSksIGRpci5jcmVhdGUoZmlsZS5wYXRoKGdldHdkKCksICJSZXN1bHRzL0ZpZ3VyZXMvRUFBUl9kZXNjcmlwdGl2ZSIpKSwgRkFMU0UpCmBgYAoKKipDVlMqKgpgYGB7cn0KRUFBUkNWUyA8LSBnZ3Bsb3QoRGF0YV9DVlNfSVRVLCBhZXMoeD0gZ2VzdGFnZV9hdF9DVlNfd2Vla3MsIHk9IEVBQVJfTGVlLCBsYWJlbD1TYW1wbGVfTmFtZSkpKwogIGdlb21fcG9pbnQoKSArZ2VvbV90ZXh0KGFlcyhsYWJlbD1TYW1wbGVfTmFtZSksaGp1c3Q9MCwgdmp1c3Q9MCkrCiAgeGxhYigiZ2VzdGF0aW9uYWwgYWdlIGF0IHNhbXBsaW5nICh3ZWVrcykiKSsKICB4bGltKDUsMjApKwogIHlsaW0oLTEwLDEwKSsKICBnZW9tX2xpbmUoeT0wLCBsaW5ldHlwZT0iZGFzaGVkIikrCiAgeWxhYigiZXBpZ2VuZXRpYyBhZ2UgYWNjZWxlcmF0aW9uIHJlc2lkdWFscyBcbihMZWUgY2xvY2spIikKCkVBQVJDVlNfc2V4IDwtIERhdGFfQ1ZTX0lUVVshaXMubmEoRGF0YV9DVlNfSVRVJEVBQVJfTGVlKSwgXSAlPiUKICBncm91cF9ieShDaGlsZF9TZXgpICU+JQogIG11dGF0ZShvdXRsaWVyID0gaWZlbHNlKGlzX291dGxpZXIoRUFBUl9MZWUpLCBTYW1wbGVfTmFtZSwgYXMubnVtZXJpYyhOQSkpKSAlPiUKICBnZ3Bsb3QoLiwgYWVzKHggPSBDaGlsZF9TZXgsIHkgPSBFQUFSX0xlZSkpICsKICAgIGdlb21fYm94cGxvdCgpICsKICAgIGdlb21fdGV4dChzaXplPTIuNSwgYWVzKGxhYmVsID0gb3V0bGllciksIG5hLnJtID0gVFJVRSwgaGp1c3Q9LTAuMykrCiAgeGxhYigiQ2hpbGQgc2V4IikrCiAgeWxhYigiZXBpZ2VuZXRpYyBhZ2UgYWNjZWxlcmF0aW9uIHJlc2lkdWFscyBcbihMZWUgY2xvY2spIikrCiAgZ2VvbV9obGluZShhZXMoeWludGVyY2VwdD0wKSkKCkVBQVJDVlNfYm94cGxvdCA8LSBnZ3Bsb3QoRGF0YV9DVlNfSVRVLCBhZXMoeD1FQUFSX0xlZSkpKyBnZW9tX2hpc3RvZ3JhbShiaW53aWR0aD0wLjEpKyBsYWJzKHg9ImVwaWdlbmV0aWMgYWdlIGFjY2VsZXJhdGlvbiByZXNpZHVhbHMgKExlZSBjbG9jaykiLCB5ID0gIkNvdW50IChOID0gMjAwKSIpCgpjb3dwbG90OjpwbG90X2dyaWQoRUFBUkNWUywgRUFBUkNWU19zZXgsIEVBQVJDVlNfYm94cGxvdCkKCmxlbmd0aChuYS5vbWl0KERhdGFfQ1ZTX0lUVSRFQUFSX0xlZSkpCiMgbm90ZSB0aGF0IDY1IHJvd3Mgd2VyZSByZW1vdmVkIGJlY2F1c2UgdGhleSBhcmUgTkEgaW4gRUFBUlZTIChubyBldGhuaWNpdHkgaW5mbykKYGBgCgpgYGB7cn0KZGVsdGFDVlNfYm94cGxvdCA8LSBnZ3Bsb3QoRGF0YV9DVlNfSVRVLCBhZXMoeD1kZWx0YV9MZWUpKSsgZ2VvbV9oaXN0b2dyYW0oYmlud2lkdGg9MC4xKSsgbGFicyh4PSJlcGlnZW5ldGljIGFnZSBhY2NlbGVyYXRpb24gZGVsdGEgKExlZSBjbG9jaykiLCB5ID0gIkNvdW50IChOID0gMjAwKSIpCiNkZWx0YUNWU19ib3hwbG90CmBgYAoKCmBgYHtyfQpwbmcoZmlsZT0iUmVzdWx0cy9GaWd1cmVzL0VBQVJfZGVzY3JpcHRpdmUvQ1ZTLnBuZyIsd2lkdGg9MjIwMCwgaGVpZ2h0PTE0MDAsIHJlcz0zMDApCmdncGxvdChEYXRhX0NWU19JVFUsIGFlcyh4PUVBQVJfTGVlKSkrIGdlb21faGlzdG9ncmFtKGJpbndpZHRoPTAuMSkrIGxhYnMoeD0iRUFBUiAoTGVlIGNsb2NrKSIsIHkgPSAiQ291bnQgKG4gPSAyMDApIikrCnRoZW1lKHRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE1KSwgYXhpcy50aXRsZS54PSBlbGVtZW50X3RleHQoc2l6ZT0xNSksIGF4aXMudGl0bGUueT0gZWxlbWVudF90ZXh0KHNpemU9MTUpKQpkZXYub2ZmKCkKYGBgCgoqKkNvcmRibG9vZCoqCmBgYHtyfQpFQUFSQ29yZCA8LSBnZ3Bsb3QoRGF0YV9Db3JkX0lUVSwgYWVzKHg9IEdlc3RhdGlvbmFsX0FnZV9XZWVrcywgeT0gRUFBUl9Cb2hsaW4sIGxhYmVsPVNhbXBsZV9OYW1lKSkrCiAgZ2VvbV9wb2ludCgpICtnZW9tX3RleHQoYWVzKGxhYmVsPVNhbXBsZV9OYW1lKSxoanVzdD0wLCB2anVzdD0wKSsKICB4bGFiKCJnZXN0YXRpb25hbCBhZ2UgYXQgYmlydGggKHdlZWtzKSIpKwogIHhsaW0oMjUsNTApKwogIHlsaW0oLTEwLDEwKSsKICBnZW9tX2xpbmUoeT0wLCBsaW5ldHlwZT0iZGFzaGVkIikrCiAgeWxhYigiZXBpZ2VuZXRpYyBhZ2UgYWNjZWxlcmF0aW9uIHJlc2lkdWFscyBcbkJvaGxpbiBjbG9jayIpCgpFQUFSQ29yZF9zZXggPC0gRGF0YV9Db3JkX0lUVVshaXMubmEoRGF0YV9Db3JkX0lUVSRFQUFSX0JvaGxpbiksIF0gJT4lCiAgZ3JvdXBfYnkoQ2hpbGRfU2V4KSAlPiUKICBtdXRhdGUob3V0bGllciA9IGlmZWxzZShpc19vdXRsaWVyKEVBQVJfQm9obGluKSwgU2FtcGxlX05hbWUsIGFzLm51bWVyaWMoTkEpKSkgJT4lCiAgZ2dwbG90KC4sIGFlcyh4ID1DaGlsZF9TZXgsIHkgPSBFQUFSX0JvaGxpbikpICsKICAgIGdlb21fYm94cGxvdCgpICsKICAgIGdlb21fdGV4dChzaXplPTIuNSxhZXMobGFiZWwgPSBvdXRsaWVyKSwgbmEucm0gPSBUUlVFLCBoanVzdCA9IC0wLjMpKwogIHhsYWIoIkNoaWxkIHNleCIpKwogIHlsYWIoImVwaWdlbmV0aWMgYWdlIGFjY2VsZXJhdGlvbiByZXNpZHVhbHMgXG5Cb2hsaW4gY2xvY2siKSsKICBnZW9tX2hsaW5lKGFlcyh5aW50ZXJjZXB0PTApKQoKRUFBUkNvcmRfYm94cGxvdCA8LSBnZ3Bsb3QoRGF0YV9Db3JkX0lUVSwgYWVzKHg9RUFBUl9Cb2hsaW4pKSsgZ2VvbV9oaXN0b2dyYW0oYmlud2lkdGg9MC4xKSsgbGFicyh4PSJFQUFSIChCb2hsaW4gY2xvY2spIiwgeSA9ICJDb3VudCAoTiA9IDM5NSkiKQoKY293cGxvdDo6cGxvdF9ncmlkKEVBQVJDb3JkLCBFQUFSQ29yZF9zZXgsIEVBQVJDb3JkX2JveHBsb3QpCmxlbmd0aChuYS5vbWl0KERhdGFfQ29yZF9JVFUkRUFBUl9Cb2hsaW4pKQpgYGAKCmBgYHtyfQpwbmcoZmlsZT0iUmVzdWx0cy9GaWd1cmVzL0VBQVJfZGVzY3JpcHRpdmUvQ29yZC5wbmciLHdpZHRoPTIyMDAsIGhlaWdodD0xNDAwLCByZXM9MzAwKQpnZ3Bsb3QoRGF0YV9Db3JkX0lUVSwgYWVzKHg9RUFBUl9Cb2hsaW4pKSsgZ2VvbV9oaXN0b2dyYW0oYmlud2lkdGg9MC4xKSsgbGFicyh4PSJFQUFSIChCb2hsaW4gY2xvY2spIiwgeSA9ICJDb3VudCAobiA9IDM5NSkiKSsKdGhlbWUodGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTUpLCBheGlzLnRpdGxlLng9IGVsZW1lbnRfdGV4dChzaXplPTE1KSwgYXhpcy50aXRsZS55PSBlbGVtZW50X3RleHQoc2l6ZT0xNSkpCmRldi5vZmYoKQpgYGAKYGBge3J9CmRlbHRhQ29yZF9ib3hwbG90IDwtIGdncGxvdChEYXRhX0NvcmRfSVRVLCBhZXMoeD1kZWx0YV9Cb2hsaW4pKSsgZ2VvbV9oaXN0b2dyYW0oYmlud2lkdGg9MC4xKSsgbGFicyh4PSJkZWx0YSAoQm9obGluIGNsb2NrKSIsIHkgPSAiQ291bnQgKE4gPSAzOTUpIikKI2RlbHRhQ29yZF9ib3hwbG90CmBgYAoKCioqUGxhY2VudGEqKgpgYGB7cn0KRUFBUlBsYWNlbnRhIDwtIGdncGxvdChEYXRhX1BsYWNlbnRhX0lUVSwgYWVzKHg9IEdlc3RhdGlvbmFsX0FnZV9XZWVrcywgeT0gRUFBUl9MZWUsIGxhYmVsPVNhbXBsZV9OYW1lKSkrCiAgZ2VvbV9wb2ludCgpICtnZW9tX3RleHQoYWVzKGxhYmVsPVNhbXBsZV9OYW1lKSxoanVzdD0wLCB2anVzdD0wKSsKICB4bGFiKCJnZXN0YXRpb25hbCBhZ2UgYXQgYmlydGggKHdlZWtzKSIpKwogIHhsaW0oMjUsNTApKwogIHlsaW0oLTEwLDEwKSsKICBnZW9tX2xpbmUoeT0wLCBsaW5ldHlwZT0iZGFzaGVkIikrCiAgeWxhYigiZXBpZ2VuZXRpYyBhZ2UgYWNjZWxlcmF0aW9uIHJlc2lkdWFscyBcbkxlZSBjbG9jayIpCgpFQUFSUGxhY2VudGFfc2V4IDwtIERhdGFfUGxhY2VudGFfSVRVWyFpcy5uYShEYXRhX1BsYWNlbnRhX0lUVSRFQUFSX0xlZSksIF0gJT4lCiAgZ3JvdXBfYnkoQ2hpbGRfU2V4KSAlPiUKICBtdXRhdGUob3V0bGllciA9IGlmZWxzZShpc19vdXRsaWVyKEVBQVJfTGVlKSwgU2FtcGxlX05hbWUsIGFzLm51bWVyaWMoTkEpKSkgJT4lCiAgZ2dwbG90KC4sIGFlcyh4ID0gQ2hpbGRfU2V4LCB5ID0gRUFBUl9MZWUpKSArCiAgICBnZW9tX2JveHBsb3QoKSArCiAgICBnZW9tX3RleHQoc2l6ZT0yLjUsYWVzKGxhYmVsID0gb3V0bGllciksIG5hLnJtID0gVFJVRSwgaGp1c3QgPSAtMC4zKSsKICB4bGFiKCJDaGlsZCBzZXgiKSsKICB5bGFiKCJlcGlnZW5ldGljIGFnZSBhY2NlbGVyYXRpb24gcmVzaWR1YWxzIFxuTGVlIGNsb2NrIikrCiAgZ2VvbV9obGluZShhZXMoeWludGVyY2VwdD0wKSkKCkVBQVJQbGFjZW50YV9ib3hwbG90IDwtIGdncGxvdChEYXRhX1BsYWNlbnRhX0lUVSwgYWVzKHg9RUFBUl9MZWUpKSsgZ2VvbV9oaXN0b2dyYW0oYmlud2lkdGg9MC4xKSsgbGFicyh4PSJFQUFSIChMZWUgY2xvY2spIiwgeSA9ICJDb3VudCAoTiA9IDQzOSkiKQoKY293cGxvdDo6cGxvdF9ncmlkKEVBQVJQbGFjZW50YSwgRUFBUlBsYWNlbnRhX3NleCwgRUFBUlBsYWNlbnRhX2JveHBsb3QpCmxlbmd0aChuYS5vbWl0KERhdGFfUGxhY2VudGFfSVRVJEVBQVJfTGVlKSkKYGBgCgpgYGB7cn0KcG5nKCJSZXN1bHRzL0ZpZ3VyZXMvRUFBUl9kZXNjcmlwdGl2ZS9QbGFjZW50YS5wbmciLCB3aWR0aD0yMjAwLCBoZWlnaHQ9MTQwMCwgcmVzPTMwMCkKZ2dwbG90KERhdGFfUGxhY2VudGFfSVRVLCBhZXMoeD1FQUFSX0xlZSkpKyBnZW9tX2hpc3RvZ3JhbShiaW53aWR0aD0wLjEpKyBsYWJzKHg9IkVBQVIgKExlZSBjbG9jaykiLCB5ID0gIkNvdW50IChuID0gNDM5KSIpKwp0aGVtZSh0ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNSksIGF4aXMudGl0bGUueD0gZWxlbWVudF90ZXh0KHNpemU9MTUpLCBheGlzLnRpdGxlLnk9IGVsZW1lbnRfdGV4dChzaXplPTE1KSkKZGV2Lm9mZigpCmBgYApgYGB7cn0KZGVsdGFQbGFjZW50YV9ib3hwbG90IDwtIGdncGxvdChEYXRhX1BsYWNlbnRhX0lUVSwgYWVzKHg9ZGVsdGFfTGVlKSkrIGdlb21faGlzdG9ncmFtKGJpbndpZHRoPTAuMSkrIGxhYnMoeD0iZGVsdGEgKExlZSBjbG9jaykiLCB5ID0gIkNvdW50IChOID0gNDg2KSIpCmRlbHRhUGxhY2VudGFfYm94cGxvdCAKYGBgCgpbdG8gdGhlIHRvcF0oI3RvcCkgIAoKIyMgUFJFRE86IFZpc3VhbGl6YXRpb24gRUFBUiB7I3Bsb3RzRUFBUlBSRURPfSAgCgoqKjQ1MEsgQ29yZGJsb29kKioKYGBge3J9CkVBQVJDb3JkNDUwSyA8LSBnZ3Bsb3QoRGF0YV9QUkVET180NTBLY29yZCwgYWVzKHg9IEdlc3RhdGlvbmFsX0FnZSwgeT0gRUFBUl9Cb2hsaW4sIGxhYmVsPVNhbXBsZV9OYW1lKSkrCiAgZ2VvbV9wb2ludCgpICtnZW9tX3RleHQoYWVzKGxhYmVsPVNhbXBsZV9OYW1lKSxoanVzdD0wLCB2anVzdD0wKSsKICB4bGFiKCJnZXN0YXRpb25hbCBhZ2UgYXQgYmlydGggKHdlZWtzKSIpKwogIHhsaW0oMjUsNTApKwogIHlsaW0oLTE1LDE1KSsKICBnZW9tX2xpbmUoeT0wLCBsaW5ldHlwZT0iZGFzaGVkIikrCiAgeWxhYigiZXBpZ2VuZXRpYyBhZ2UgYWNjZWxlcmF0aW9uIHJlc2lkdWFscyBcbkJvaGxpbiBjbG9jayIpCgpFQUFSQ29yZDQ1MEtfc2V4IDwtIERhdGFfUFJFRE9fNDUwS2NvcmRbIWlzLm5hKERhdGFfUFJFRE9fNDUwS2NvcmQkRUFBUl9Cb2hsaW4pLCBdICU+JQogIGdyb3VwX2J5KENoaWxkX1NleCkgJT4lCiAgbXV0YXRlKG91dGxpZXIgPSBpZmVsc2UoaXNfb3V0bGllcihFQUFSX0JvaGxpbiksIFNhbXBsZV9OYW1lLCBhcy5udW1lcmljKE5BKSkpICU+JQogIGdncGxvdCguLCBhZXMoeCA9IENoaWxkX1NleCwgeSA9IEVBQVJfQm9obGluKSkgKwogICAgZ2VvbV9ib3hwbG90KCkgKwogICAgZ2VvbV90ZXh0KHNpemU9Mi41LGFlcyhsYWJlbCA9IG91dGxpZXIpLCBuYS5ybSA9IFRSVUUsIGhqdXN0ID0gLTAuMykrCiAgeGxhYigiQ2hpbGQgc2V4IikrCiAgeWxhYigiZXBpZ2VuZXRpYyBhZ2UgYWNjZWxlcmF0aW9uIHJlc2lkdWFscyBcbkJvaGxpbiBjbG9jayIpKwogIGdlb21faGxpbmUoYWVzKHlpbnRlcmNlcHQ9MCkpCgpFQUFSQ29yZDQ1MEtfYm94cGxvdCA8LSBnZ3Bsb3QoRGF0YV9QUkVET180NTBLY29yZCwgYWVzKHg9RUFBUl9Cb2hsaW4pKSsgZ2VvbV9oaXN0b2dyYW0oYmlud2lkdGg9MC4xKSsgbGFicyh4PSJFQUFSIChCb2hsaW4gY2xvY2spIiwgeSA9ICJDb3VudCAoTiA9IDc4NSkiKQoKI2Nvd3Bsb3Q6OnBsb3RfZ3JpZChFQUFSQ29yZDQ1MEssIEVBQVJDb3JkNDUwS19zZXgsIEVBQVJDb3JkNDUwS19ib3hwbG90KQpsZW5ndGgobmEub21pdChEYXRhX1BSRURPXzQ1MEtjb3JkJEVBQVJfQm9obGluKSkKYGBgCgpgYGB7cn0KcG5nKCJSZXN1bHRzL0ZpZ3VyZXMvRUFBUl9kZXNjcmlwdGl2ZS9Db3JkNDUwS19QUkVETy5wbmciLCB3aWR0aD0yMjAwLCBoZWlnaHQ9MTQwMCwgcmVzPTMwMCkKZ2dwbG90KERhdGFfUFJFRE9fNDUwS2NvcmQsIGFlcyh4PUVBQVJfQm9obGluKSkrIGdlb21faGlzdG9ncmFtKGJpbndpZHRoPTAuMSkrIGxhYnMoeD0iRUFBUiAoQm9obGluIGNsb2NrKSIsIHkgPSAiQ291bnQgKG4gPSA3ODUpIikrCnRoZW1lKHRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE1KSwgYXhpcy50aXRsZS54PSBlbGVtZW50X3RleHQoc2l6ZT0xNSksIGF4aXMudGl0bGUueT0gZWxlbWVudF90ZXh0KHNpemU9MTUpKQpkZXYub2ZmKCkKYGBgCgoKKipFUElDIENvcmRibG9vZCoqCmBgYHtyfQpFQUFSQ29yZEVQSUMgPC0gZ2dwbG90KERhdGFfUFJFRE9fRVBJQ2NvcmQsIGFlcyh4PSBHZXN0YXRpb25hbF9BZ2UsIHk9IEVBQVJfQm9obGluLCBsYWJlbD1TYW1wbGVfTmFtZSkpKwogIGdlb21fcG9pbnQoKSArZ2VvbV90ZXh0KGFlcyhsYWJlbD1TYW1wbGVfTmFtZSksaGp1c3Q9MCwgdmp1c3Q9MCkrCiAgeGxhYigiZ2VzdGF0aW9uYWwgYWdlIGF0IGJpcnRoICh3ZWVrcykiKSsKICB4bGltKDMwLDQ1KSsKICB5bGltKC0xNSwxNSkrCiAgZ2VvbV9saW5lKHk9MCwgbGluZXR5cGU9ImRhc2hlZCIpKwogIHlsYWIoImVwaWdlbmV0aWMgYWdlIGFjY2VsZXJhdGlvbiByZXNpZHVhbHMgXG5Cb2hsaW4gY2xvY2siKQoKRUFBUkNvcmRFUElDX3NleCA8LSBEYXRhX1BSRURPX0VQSUNjb3JkWyFpcy5uYShEYXRhX1BSRURPX0VQSUNjb3JkJEVBQVJfQm9obGluKSwgXSAlPiUKICBncm91cF9ieShDaGlsZF9TZXgpICU+JQogIG11dGF0ZShvdXRsaWVyID0gaWZlbHNlKGlzX291dGxpZXIoRUFBUl9Cb2hsaW4pLCBTYW1wbGVfTmFtZSwgYXMubnVtZXJpYyhOQSkpKSAlPiUKICBnZ3Bsb3QoLiwgYWVzKHggPSBDaGlsZF9TZXgsIHkgPSBFQUFSX0JvaGxpbikpICsKICAgIGdlb21fYm94cGxvdCgpICsKICAgIGdlb21fdGV4dChhZXMobGFiZWwgPSBvdXRsaWVyKSwgbmEucm0gPSBUUlVFLCBoanVzdCA9IC0wLjMpKwogIHhsYWIoIkNoaWxkIHNleCIpKwogIHlsYWIoImVwaWdlbmV0aWMgYWdlIGFjY2VsZXJhdGlvbiByZXNpZHVhbHMgXG5Cb2hsaW4gY2xvY2siKSsKICBnZW9tX2hsaW5lKGFlcyh5aW50ZXJjZXB0PTApKQoKRUFBUkNvcmRFUElDX2JveHBsb3QgPC0gZ2dwbG90KERhdGFfUFJFRE9fRVBJQ2NvcmQsIGFlcyh4PUVBQVJfQm9obGluKSkrIGdlb21faGlzdG9ncmFtKGJpbndpZHRoPTAuMSkrIGxhYnMoeD0iRUFBUiAoQm9obGluIGNsb2NrKSIsIHkgPSAiQ291bnQgKE4gPSAxNDYpIikKCiNjb3dwbG90OjpwbG90X2dyaWQoRUFBUkNvcmRFUElDLCBFQUFSQ29yZEVQSUNfc2V4LCBFQUFSQ29yZEVQSUNfYm94cGxvdCkKbGVuZ3RoKG5hLm9taXQoRGF0YV9QUkVET19FUElDY29yZCRFQUFSX0JvaGxpbikpCmBgYAoKYGBge3J9CnBuZygiUmVzdWx0cy9GaWd1cmVzL0VBQVJfZGVzY3JpcHRpdmUvQ29yZEVQSUNfUFJFRE8ucG5nIiwgd2lkdGg9MjIwMCwgaGVpZ2h0PTE0MDAsIHJlcz0zMDApCmdncGxvdChEYXRhX1BSRURPX0VQSUNjb3JkLCBhZXMoeD1FQUFSX0JvaGxpbikpKyBnZW9tX2hpc3RvZ3JhbShiaW53aWR0aD0wLjEpKyBsYWJzKHg9IkVBQVIgKEJvaGxpbiBjbG9jaykiLCB5ID0gIkNvdW50IChuID0gMTQ2KSIpKwp0aGVtZSh0ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNSksIGF4aXMudGl0bGUueD0gZWxlbWVudF90ZXh0KHNpemU9MTUpLCBheGlzLnRpdGxlLnk9IGVsZW1lbnRfdGV4dChzaXplPTE1KSkKZGV2Lm9mZigpCmBgYAoKKipFUElDIFBsYWNlbnRhKioKYGBge3J9CkVBQVJQbGFjZW50YUVQSUMgPC0gZ2dwbG90KERhdGFfUFJFRE9fRVBJQ3BsYWNlbnRhLCBhZXMoeD0gR2VzdGF0aW9uYWxfQWdlLCB5PSBFQUFSX0xlZSwgbGFiZWw9U2FtcGxlX05hbWUpKSsKICBnZW9tX3BvaW50KCkgK2dlb21fdGV4dChhZXMobGFiZWw9U2FtcGxlX05hbWUpLGhqdXN0PTAsIHZqdXN0PTApKwogIHhsYWIoImdlc3RhdGlvbmFsIGFnZSBhdCBiaXJ0aCAod2Vla3MpIikrCiAgeGxpbSgzMCw0NSkrCiAgeWxpbSgtMTUsMTUpKwogIGdlb21fbGluZSh5PTAsIGxpbmV0eXBlPSJkYXNoZWQiKSsKICB5bGFiKCJlcGlnZW5ldGljIGFnZSBhY2NlbGVyYXRpb24gcmVzaWR1YWxzIFxuTGVlIGNsb2NrIikKCkVBQVJQbGFjZW50YUVQSUNfc2V4IDwtIERhdGFfUFJFRE9fRVBJQ3BsYWNlbnRhWyFpcy5uYShEYXRhX1BSRURPX0VQSUNwbGFjZW50YSRFQUFSX0xlZSksXSAlPiUKICBncm91cF9ieShDaGlsZF9TZXgpICU+JQogICNtdXRhdGUob3V0bGllciA9IGlmZWxzZShpc19vdXRsaWVyKEVBQVJfTGVlKSwgU2FtcGxlX05hbWUsIGFzLm51bWVyaWMoTkEpKSkgJT4lCiAgZ2dwbG90KC4sIGFlcyh4ID0gQ2hpbGRfU2V4LCB5ID0gRUFBUl9MZWUpKSArCiAgICBnZW9tX2JveHBsb3QoKSArCiAgICAjZ2VvbV90ZXh0KHNpemU9Mi41LCBhZXMobGFiZWwgPSBvdXRsaWVyKSwgbmEucm0gPSBUUlVFLCBoanVzdCA9IC0wLjMpKwogIHhsYWIoIkNoaWxkIHNleCIpKwogIHlsYWIoImVwaWdlbmV0aWMgYWdlIGFjY2VsZXJhdGlvbiByZXNpZHVhbHMgXG5MZWUgY2xvY2siKSsKICBnZW9tX2hsaW5lKGFlcyh5aW50ZXJjZXB0PTApKQoKRUFBUlBsYWNlbnRhRVBJQ19ib3hwbG90IDwtIGdncGxvdChEYXRhX1BSRURPX0VQSUNwbGFjZW50YSwgYWVzKHg9RUFBUl9MZWUpKSsgZ2VvbV9oaXN0b2dyYW0oYmlud2lkdGg9MC4xKSsgbGFicyh4PSJFQUFSIChMZWUgY2xvY2spIiwgeSA9ICJDb3VudCAoTiA9IDExOCkiKQoKI2Nvd3Bsb3Q6OnBsb3RfZ3JpZChFQUFSUGxhY2VudGFFUElDLCBFQUFSUGxhY2VudGFFUElDX3NleCwgRUFBUlBsYWNlbnRhRVBJQ19ib3hwbG90KQpsZW5ndGgobmEub21pdChEYXRhX1BSRURPX0VQSUNwbGFjZW50YSRFQUFSX0xlZSkpCmBgYAoKYGBge3J9CnBuZygiUmVzdWx0cy9GaWd1cmVzL0VBQVJfZGVzY3JpcHRpdmUvUGxhY2VudGFFUElDX1BSRURPLnBuZyIsIHdpZHRoPTIyMDAsIGhlaWdodD0xNDAwLCByZXM9MzAwKQpnZ3Bsb3QoRGF0YV9QUkVET19FUElDcGxhY2VudGEsIGFlcyh4PUVBQVJfTGVlKSkrIGdlb21faGlzdG9ncmFtKGJpbndpZHRoPTAuMSkrIGxhYnMoeD0iRUFBUiAoTGVlIGNsb2NrKSIsIHkgPSAiQ291bnQgKG4gPSAxMTgpIikrCnRoZW1lKHRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE1KSwgYXhpcy50aXRsZS54PSBlbGVtZW50X3RleHQoc2l6ZT0xNSksIGF4aXMudGl0bGUueT0gZWxlbWVudF90ZXh0KHNpemU9MTUpKQpkZXYub2ZmKCkKYGBgCgpbdG8gdGhlIHRvcF0oI3RvcCkKCiMgU2luZ2xlIFRpc3N1ZSBNb2RlbHMKCmBgYHtyfQppZmVsc2UoIWRpci5leGlzdHMoZmlsZS5wYXRoKGdldHdkKCksICJJbnB1dERhdGEvRGF0YV9FbGFzdGljTmV0cy8iKSksIGRpci5jcmVhdGUoZmlsZS5wYXRoKGdldHdkKCksICJJbnB1dERhdGEvRGF0YV9FbGFzdGljTmV0cy8iKSksIEZBTFNFKQpgYGAKCmBgYHtyfQppZmVsc2UoIWRpci5leGlzdHMoZmlsZS5wYXRoKGdldHdkKCksICJSZXN1bHRzL0ZpZ3VyZXMvZWxhc3RpY05ldF9zaW5nbGVUaXNzdWVzLyIpKSwgZGlyLmNyZWF0ZShmaWxlLnBhdGgoZ2V0d2QoKSwgIlJlc3VsdHMvRmlndXJlcy9lbGFzdGljTmV0X3NpbmdsZVRpc3N1ZXMvIikpLCBGQUxTRSkKYGBgCgpgYGB7cn0KaWZlbHNlKCFkaXIuZXhpc3RzKGZpbGUucGF0aChnZXR3ZCgpLCAiUmVzdWx0cy9GaWd1cmVzL2VsYXN0aWNOZXRfc2luZ2xlVGlzc3Vlcy9PdXRjb21lX21haW4vIikpLCBkaXIuY3JlYXRlKGZpbGUucGF0aChnZXR3ZCgpLCAiUmVzdWx0cy9GaWd1cmVzL2VsYXN0aWNOZXRfc2luZ2xlVGlzc3Vlcy9PdXRjb21lX21haW4vIikpLCBGQUxTRSkKYGBgCgpgYGB7cn0KaWZlbHNlKCFkaXIuZXhpc3RzKGZpbGUucGF0aChnZXR3ZCgpLCAiUmVzdWx0cy9GaWd1cmVzL2VsYXN0aWNOZXRfc2luZ2xlVGlzc3Vlcy9PdXRjb21lX2FkZC8iKSksIGRpci5jcmVhdGUoZmlsZS5wYXRoKGdldHdkKCksICJSZXN1bHRzL0ZpZ3VyZXMvZWxhc3RpY05ldF9zaW5nbGVUaXNzdWVzL091dGNvbWVfYWRkLyIpKSwgRkFMU0UpCmBgYAoKYGBge3J9CmlmZWxzZSghZGlyLmV4aXN0cyhmaWxlLnBhdGgoZ2V0d2QoKSwgIlJlc3VsdHMvRmlndXJlcy9lbGFzdGljTmV0X3NpbmdsZVRpc3N1ZXMvT3V0Y29tZV9hZGQvYWxjb2hvbCIpKSwgZGlyLmNyZWF0ZShmaWxlLnBhdGgoZ2V0d2QoKSwgIlJlc3VsdHMvRmlndXJlcy9lbGFzdGljTmV0X3NpbmdsZVRpc3N1ZXMvT3V0Y29tZV9hZGQvYWxjb2hvbCIpKSwgRkFMU0UpCmBgYAoKYGBge3J9CmlmZWxzZSghZGlyLmV4aXN0cyhmaWxlLnBhdGgoZ2V0d2QoKSwgIlJlc3VsdHMvRmlndXJlcy9lbGFzdGljTmV0X3NpbmdsZVRpc3N1ZXMvT3V0Y29tZV9hZGQvc2V4X3NwbGl0IikpLCBkaXIuY3JlYXRlKGZpbGUucGF0aChnZXR3ZCgpLCAiUmVzdWx0cy9GaWd1cmVzL2VsYXN0aWNOZXRfc2luZ2xlVGlzc3Vlcy9PdXRjb21lX2FkZC9zZXhfc3BsaXQiKSksIEZBTFNFKQpgYGAKCmBgYHtyfQppZmVsc2UoIWRpci5leGlzdHMoZmlsZS5wYXRoKGdldHdkKCksICJSZXN1bHRzL1RhYmxlcy8iKSksIGRpci5jcmVhdGUoZmlsZS5wYXRoKGdldHdkKCksICJSZXN1bHRzL1RhYmxlcy8iKSksIEZBTFNFKQpgYGAKCmBgYHtyfQpybShsaXN0ID0gc2V0ZGlmZihscygpLCBsc2Yuc3RyKCkpKQpgYGAKCgoqKklUVSoqCgojIyBDb3JkIGJsb29kIGVsYXN0aWMgbmV0IHsjZWxhc3RpY25ldENvcmRJVFV9ICAKbWFpbiBtb2RlbCwgd2l0aG91dCBhbGNvaG9sIHZhcmlhYmxlCgpgYGB7cn0KIyBpbiBjYXNlIHlvdSB3YW50IHRvIHN0YXJ0IGZyb20gaGVyZQpsb2FkKCJJbnB1dERhdGEvQ2xvY2tDYWxjdWxhdGlvbnNJbnB1dC9SZWdfSW5wdXRfRGF0YV9Db3JkX0lUVV9FQUFSX25vTmFfbi5SZGF0YSIpCmBgYAoKCmBgYHtyfQp5cmNfbWF0X0lUVV9Db3JkX24gPC0gbWF0cml4KFJlZ19JbnB1dF9EYXRhX0NvcmRfSVRVX0VBQVJfbm9OYV9uJEVBQVJfQm9obGluKQp4cmNfbWF0X0lUVV9Db3JkX24gPC0gbW9kZWwubWF0cml4KCB+IC4gLSBFQUFSX0JvaGxpbiwgZGF0YSA9IFJlZ19JbnB1dF9EYXRhX0NvcmRfSVRVX0VBQVJfbm9OYV9uKVssIC0xXQp5cmNfbWF0X0lUVV9zY2FsZWRfQ29yZF9uIDwtIHNjYWxlKHlyY19tYXRfSVRVX0NvcmRfbikKeHJjX21hdF9JVFVfc2NhbGVkX0NvcmRfbiA8LSBzY2FsZSh4cmNfbWF0X0lUVV9Db3JkX24pCmBgYAoKPCEtLSBzZXQgc2VlZCAtLT4KPCEtLSBgYGB7cn0gLS0+CjwhLS0gc2V0LnNlZWQoMjAyMCkgLS0+CjwhLS0gYGBgIC0tPgoKCjwhLS0gYGBge3IsIHdhcm5pbmc9Rn0gLS0+CjwhLS0gICBuYm9vdCA9IDEwMDAgLS0+Cgo8IS0tICAgc3RhcnRfdGltZSA8LSBTeXMudGltZSgpIC0tPgo8IS0tICAgYm9vdHN0cmFwc19Db3JkX0lUVV9uIDwtIHJlcGxpY2F0ZShuYm9vdCwgeyAtLT4KPCEtLSAgICAgcndzIDwtIHNhbXBsZSgxOm5yb3coeHJjX21hdF9JVFVfc2NhbGVkX0NvcmRfbiksIHJlcGxhY2UgPSBUUlVFKSAtLT4KPCEtLSAgICAgZW5zcih4cmNfbWF0X0lUVV9zY2FsZWRfQ29yZF9uW3J3cywgXSwgeXJjX21hdF9JVFVfc2NhbGVkX0NvcmRfbltyd3MsIF0sIHN0YW5kYXJkaXplZCA9IEZBTFNFLCBmYW1pbHk9ImdhdXNzaWFuIiwgbmxhbWJkYT0xMDAsIG5mb2xkcz0xMCwgYWxwaGE9YygwLjAsMC4xLDAuMiwwLjMsMC40LDAuNSwwLjYsMC43LDAuOCwwLjksMS4wKSkgLS0+CjwhLS0gICB9LCAtLT4KPCEtLSAgIHNpbXBsaWZ5ID0gRkFMU0UpIC0tPgoKPCEtLSAgIGVuZF90aW1lIDwtIFN5cy50aW1lKCkgLS0+CjwhLS0gICBlbmRfdGltZSAtIHN0YXJ0X3RpbWUgLS0+Cgo8IS0tIGBgYCAtLT4KCjwhLS0gYGBge3J9IC0tPgo8IS0tIHNhdmUoYm9vdHN0cmFwc19Db3JkX0lUVV9uLCBmaWxlPSJJbnB1dERhdGEvRGF0YV9FbGFzdGljTmV0cy9ib290c3RyYXBzX0NvcmRfSVRVX25fMTAwMC5SZGF0YSIpIC0tPgo8IS0tIGBgYCAtLT4KCgpgYGB7cn0KbG9hZCgiSW5wdXREYXRhL0RhdGFfRWxhc3RpY05ldHMvYm9vdHN0cmFwc19Db3JkX0lUVV9uXzEwMDAuUmRhdGEiKQpgYGAKCmZpcnN0IGdldCBhIHN1bW1hcnkgb2YgYWxsIGVuc3Igb2JqZWN0cwpgYGB7cn0Kc3VtbWFyaWVzX0NvcmRfSVRVX24gPC0KICBib290c3RyYXBzX0NvcmRfSVRVX24gJT4lCiAgbGFwcGx5KHN1bW1hcnkpICU+JQogIHJiaW5kbGlzdChpZGNvbCA9ICJib290c3RyYXAiKQoKc3VtbWFyaWVzX0NvcmRfSVRVX24KYGBgCgpUaGUgc3VtbWFyeSBtZXRob2QgZm9yIGVuc3Igb2JqZWN0cyByZXR1cm5zIGEgZGF0YS50YWJsZSB3aXRoIHZhbHVlcyBvZiDOuywgzrEsIHRoZSBtZWFuIGNyb3NzLXZhbGlkYXRpb24gZXJyb3IgY3ZtLCBhbmQgdGhlIG51bWJlciBvZiBub24temVybyBjb2VmZmljaWVudHMuIFRoZSBsX2luZGV4IGlzIHRoZSBsaXN0IGluZGV4IG9mIHRoZSBlbnNyIG9iamVjdCBhc3NvY2lhdGVkIHdpdGggdGhlIG5vdGVkIM6xIHZhbHVlLgoKRm9yIGVhY2ggYm9vdHN0cmFwLCBsb29rIGF0IHRoZSBudW1iZXIgb2Ygbm9uLXplcm8gY29lZmZpY2llbnRzIGFuZCB0aGUgbWluaW11bSBjdm0gZm9yIHRoaXMgbnVtYmVyIG9mIG5vbi16ZXJvIGNvZWZmaWNpZW50czoKYGBge3J9CnN1bW1hcmllc19Db3JkX0lUVV9uWywgLlNEW2N2bSA9PSBtaW4oY3ZtKV0sIGJ5ID0gYygiYm9vdHN0cmFwIiwgIm56ZXJvIildICU+JQogIGdncGxvdDI6OmdncGxvdChkYXRhID0gLikgKwogIGdncGxvdDI6OmFlcyh4ID0gbnplcm8sIHkgPSBjdm0sIGdyb3VwID0gYm9vdHN0cmFwKSArCiAgZ2dwbG90Mjo6Z2VvbV9wb2ludCgpICsKICBnZ3Bsb3QyOjpnZW9tX2xpbmUoKSsKICBnZ3Bsb3QyOjpsYWJzKHg9Ilxubnplcm8iLCB5PSJjdm1cbiIpKwogIGdncGxvdDI6OnRoZW1lKHRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE1KSwgYXhpcy50aXRsZS54PSBlbGVtZW50X3RleHQoc2l6ZT0xNSksIGF4aXMudGl0bGUueT0gZWxlbWVudF90ZXh0KHNpemU9MTUpKSsKICBnZ3Bsb3QyOjp0aGVtZV9idygpCiAgCmBgYAppbiB0aGUgInN0YW5kYXJkIiBwcm9jZWR1cmUsIHRoZSBwcmVmZXJhYmxlIG1vZGVsIGlzIGRlZmluZWQgYXMgdGhlIG1vZGVsIHdpdGggdGhlIG1pbmltdW0gY3ZtIChuemVybywgYWxwaGEsIGxhbWJkYSBldGMuIGFyZSBzZWxlY3RlZCBmcm9tIHRoaXMpCgpgYGB7cn0KcG5nKGZpbGVuYW1lPSJSZXN1bHRzL0ZpZ3VyZXMvZWxhc3RpY05ldF9zaW5nbGVUaXNzdWVzL091dGNvbWVfbWFpbi9ib290c3RyYXBzX0NvcmQucG5nIiwgd2lkdGg9MjIwMCwgaGVpZ2h0PTE0MDAsIHJlcz00MDApCnN1bW1hcmllc19Db3JkX0lUVV9uWywgLlNEW2N2bSA9PSBtaW4oY3ZtKV0sIGJ5ID0gYygiYm9vdHN0cmFwIiwgIm56ZXJvIildICU+JQogIGdncGxvdDI6OmdncGxvdChkYXRhID0gLikgKwogIGdncGxvdDI6OmFlcyh4ID0gbnplcm8sIHkgPSBjdm0sIGdyb3VwID0gYm9vdHN0cmFwKSArCiAgZ2dwbG90Mjo6Z2VvbV9wb2ludCgpICsKICBnZ3Bsb3QyOjpnZW9tX2xpbmUoKSsKICBnZ3Bsb3QyOjpsYWJzKHg9Ilxubnplcm8iLCB5PSJjdm1cbiIpKwogIGdncGxvdDI6OnRoZW1lKHRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE4KSwgYXhpcy50aXRsZS54PSBlbGVtZW50X3RleHQoc2l6ZT0yMCksIGF4aXMudGl0bGUueT0gZWxlbWVudF90ZXh0KHNpemU9MjApKSsKICBnZ3Bsb3QyOjp0aGVtZV9idygpCmRldi5vZmYoKQpgYGAKCk5vdyBhIGxvb2sgYXQgdGhlIGNvZWZmaWNpZW50cwpidWlsZCBhIGRhdGEudGFibGUgd2l0aCBjb2x1bW5zIHRvIHN0b3JlIHRoZSBjb2VmZmljaWVudCB2YWx1ZXMgZm9yIHRoZSBtb2RlbHMgd2l0aCBzbWFsbGVzdCBjdm0gYnkgbnVtYmVyIG9mIG5vbi16ZXJvIGNvZWZmaWNpZW50cyAoYW5kIGJvb3RzdHJhcCkuCgo8IS0tIGBgYHtyLCB3YXJuaW5nPUZBTFNFfSAtLT4KPCEtLSAjIGxvd2VzdCBjdm0gYnkgYm9vdHN0cmFwIGFuZCBuemVybyAtLT4KPCEtLSBwbV9Db3JkX0lUVV9uIDwtIHN1bW1hcmllc19Db3JkX0lUVV9uWywgLlNEW2N2bSA9PSBtaW4oY3ZtKV0sIGJ5ID0gYygiYm9vdHN0cmFwIiwgIm56ZXJvIildIC0tPgo8IS0tIHBtMl9Db3JkX0lUVV9uIDwtIE5VTEwgLS0+Cgo8IS0tIGZvcihpIGluIGFzLmludGVnZXIoc2VxKDEsIG5yb3cocG1fQ29yZF9JVFVfbiksIGJ5ID0gMSkpKSB7IC0tPgo8IS0tICAgcG0yX0NvcmRfSVRVX24gPC0gcmJpbmQocG0yX0NvcmRfSVRVX24sIC0tPgo8IS0tICAgICAgICAgICAgICAgIGNiaW5kKHBtX0NvcmRfSVRVX25baSwgXSwgLS0+CjwhLS0gICAgICAgICAgICAgICAgdChhcy5tYXRyaXgoY29lZihib290c3RyYXBzX0NvcmRfSVRVX25bW3BtX0NvcmRfSVRVX25baSwgYm9vdHN0cmFwXV1dW1twbV9Db3JkX0lUVV9uW2ksIGxfaW5kZXhdXV0sIHMgPSBwbV9Db3JkX0lUVV9uW2ksIGxhbWJkYV0pKSkgLS0+CjwhLS0gICAgICAgICAgICAgICAgKSAtLT4KPCEtLSAgICkgLS0+CjwhLS0gfSAtLT4KCjwhLS0gcG0yX0NvcmRfSVRVX24gLS0+CjwhLS0gYGBgIC0tPgoKCjwhLS0gYGBge3J9IC0tPgo8IS0tICMgc2F2ZSAicHJlZmVyYWJsZSBtb2RlbHMiIC0tPgo8IS0tIHNhdmUocG0yX0NvcmRfSVRVX24sIGZpbGU9IklucHV0RGF0YS9EYXRhX0VsYXN0aWNOZXRzL3BtMl9Db3JkX0lUVV9uLlJkYXRhIikgLS0+CjwhLS0gYGBgIC0tPgoKCmBgYHtyfQpsb2FkKCJJbnB1dERhdGEvRGF0YV9FbGFzdGljTmV0cy9wbTJfQ29yZF9JVFVfbi5SZGF0YSIpCiMgY29lZmZpY2llbnQgdmFsdWVzIGZvciB0aGUgbW9kZWxzIHdpdGggc21hbGxlc3QgY3ZtIGJ5IG51bWJlciBvZiBub24tZXJ6byBjb2VmZmljaWVudHMgYW5kIGJvb3RzdHJhcApgYGAKCmxvb2sgaG93IG9mdGVuIGEgcGFydGljdWxhciB2YXJpYWJsZSBpcyBhc3NvY2lhdGVkIHdpdGggYSBub24temVybyBjb2VmZmljaWVudCBpbiBhIG1vZGVsIHdpdGggYSBnaXZlbiBudW1iZXIgb2Ygbm9uLXplcm8gY29lZmZpY2llbnRzIChvdmVyIGFsbCBib290c3RyYXBzKQoKYGBge3J9CmNzdW1tYXJ5X0NvcmRfSVRVX24gPC0gUmVkdWNlKGZ1bmN0aW9uKHgseSkgbWVyZ2UoeCA9IHgsIHkgPSB5LCBieSA9ICJuemVybyIpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3QocG0yX0NvcmRfSVRVX25bLCBsYXBwbHkoLlNELCBmdW5jdGlvbih4KSB7bWVhbih4ICE9IDApfSksIC5TRGNvbHMgPSBjKCJDaGlsZF9TZXhmZW1hbGUiLCAiQ2hpbGRfQmlydGhfV2VpZ2h0IiwgIkNoaWxkX0JpcnRoX0xlbmd0aCIsICJDaGlsZF9IZWFkX0NpcmN1bWZlcmVuY2VfQXRfQmlydGgiLCAiRGVsaXZlcnlfbW9kZV9kaWNob3RvbWFpZGVkIiwgIkluZHVjZWRfTGFib3VyeWVzIiwgIlBhcml0eV9kaWNob3RvbWdpdmVuIGJpcnRoIGJlZm9yZSIsICJNYXRlcm5hbF9BZ2VfWWVhcnMiLCAiTWF0ZXJuYWxfQm9keV9NYXNzX0luZGV4X2luX0Vhcmx5X1ByZWduYW5jeSIsICJNYXRlcm5hbF9IeXBlcnRlbnNpb25fZGljaG90b21oeXBlcnRlbnNpb24gaW4gY3VycmVudCBwcmVnbmFuY3kiLCAiTWF0ZXJuYWxfRGlhYmV0ZXNfZGljaG90b21kaWFiZXRlcyBpbiBjdXJyZW50IHByZWduYW5jeSIsICJNYXRlcm5hbF9NZW50YWxfRGlzb3JkZXJzWWVzIiwgInNtb2tpbmdfZGljaG90b215ZXMiKSwgYnkgPSBuemVyb10KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbTJfQ29yZF9JVFVfblssIC4obWVhbl9jdm0gPSBtZWFuKGN2bSkpLCBieSA9IG56ZXJvXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG0yX0NvcmRfSVRVX25bLCAuKG1lZGlhbl9jdm0gPSBtZWRpYW4oY3ZtKSksIGJ5ID0gbnplcm9dCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApKVtvcmRlcihuemVybyldCgpjc3VtbWFyeV9Db3JkX0lUVV9uCmBgYAoKCnBsb3QgdGhlIHJlc3VsdHMsIGluIHRoZSBmb2xsb3dpbmcgZ3JhcGhpYyB0aGUgc2l6ZSBhbmQgY29sb3Igb2YgdGhlIHBvaW50cyBpbiB0aGUgdG9wIHBsb3QgaW5kaWNhdGUgaG93IG9mdGVuIHRoZSB2YXJpYWJsZSBpcyBpbiB0aGUgbW9kZWwgd2l0aCBuemVybyBub24temVybyBjb2VmZmljZW50cwoKYGBge3J9CmcxX0NvcmRfSVRVX24gPC0KICBjc3VtbWFyeV9Db3JkX0lUVV9uICU+JQogIG1lbHQoaWQudmFycyA9IGMoIm56ZXJvIiwgIm1lYW5fY3ZtIiwgIm1lZGlhbl9jdm0iKSkgJT4lCiAgZ2dwbG90Mjo6Z2dwbG90KC4pICsKICBnZ3Bsb3QyOjp0aGVtZV9idygpICsKICBnZ3Bsb3QyOjphZXMoeCA9IG56ZXJvKSArCiAgZ2dwbG90Mjo6Z2VvbV9wb2ludChtYXBwaW5nID0gZ2dwbG90Mjo6YWVzKHkgPSB2YXJpYWJsZSwgc2l6ZSA9IHZhbHVlLCBhbHBoYSA9IHZhbHVlLCBjb2xvciA9IHZhbHVlKjEwMCkpICsKICBnZ3Bsb3QyOjpzY2FsZV9jb2xvcl9ncmFkaWVudDIoaGlnaCA9ICdncmVlbicsIG1pZCA9ICJwdXJwbGUiLCBsb3cgPSAiYmxhY2siLCBtaWRwb2ludCA9NTApKwogIGdncGxvdDI6OnNjYWxlX2FscGhhKGd1aWRlID0gJ25vbmUnKSsKICBnZ3Bsb3QyOjpzY2FsZV9zaXplKGd1aWRlID0gJ25vbmUnKSsKICBnZ3Bsb3QyOjpzY2FsZV95X2Rpc2NyZXRlKGxhYmVscz0gYygiY2hpbGQgc2V4IiwgImJpcnRoIHdlaWdodCIsICJiaXJ0aCBsZW5ndGgiLCAiaGVhZCBjaXJjdW1mZXJlbmNlIiwgImRlbGl2ZXJ5IG1vZGUiLCAiaW5kdWNlZCBsYWJvciIsICJwYXJpdHkiLCAibWF0ZXJuYWwgYWdlIiwgIm1hdGVybmFsIEJNSSIsICJtYXRlcm5hbCBoeXBlcnRlbnNpb24iLCAibWF0ZXJuYWwgZGlhYmV0ZXMiLCAibWF0ZXJuYWwgbWVudGFsIGRpc29yZGVycyIsICJtYXRlcm5hbCBzbW9raW5nIikpKwogIGdncGxvdDI6OnNjYWxlX3hfY29udGludW91cyhicmVha3M9MDoxNCwgbGFiZWxzPSkrCiAgZ2dwbG90Mjo6bGFicyh5PSJwcmVkaWN0b3JcbiIsIHggPSAiXG5udW1iZXIgb2Ygbm9uLXplcm8gY29lZmZpY2llbnRzIiwgY29sb3I9IiUiKSsKICBnZ3Bsb3QyOjp0aGVtZSh0ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNSksIGF4aXMudGl0bGUueD0gZWxlbWVudF90ZXh0KHNpemU9MTUpLCBheGlzLnRpdGxlLnk9IGVsZW1lbnRfdGV4dChzaXplPTE1KSkKICAKCmcyX0NvcmRfSVRVX24gPC0KICBjc3VtbWFyeV9Db3JkX0lUVV9uICU+JQogIGdncGxvdDI6OmdncGxvdCguKSArCiAgZ2dwbG90Mjo6dGhlbWVfYncoKSArCiAgZ2dwbG90Mjo6YWVzKHggPSBuemVybywgeSA9IG1lZGlhbl9jdm0pICsKICBnZ3Bsb3QyOjpnZW9tX3BvaW50KCkgKyBnZ3Bsb3QyOjpnZW9tX2xpbmUoKSsKICBnZ3Bsb3QyOjpsYWJzKHk9Im1lZGlhbiBjdm0iLCB4ID0gIm56ZXJvIikrCiAgZ2dwbG90Mjo6c2NhbGVfeF9jb250aW51b3VzKGJyZWFrcz0wOjE0LCBsYWJlbHM9KSsKICBnZ3Bsb3QyOjp0aGVtZShheGlzLnRleHQ9ZWxlbWVudF90ZXh0KHNpemU9MTUpLGF4aXMudGl0bGU9ZWxlbWVudF90ZXh0KHNpemU9MTgpKQoKZ3JpZEV4dHJhOjpncmlkLmFycmFuZ2UoZzFfQ29yZF9JVFVfbiwgZzJfQ29yZF9JVFVfbiwgbmNvbCA9IDEpCgpgYGAKCgpgYGB7cn0KcG5nKGZpbGVuYW1lPSJSZXN1bHRzL0ZpZ3VyZXMvZWxhc3RpY05ldF9zaW5nbGVUaXNzdWVzL091dGNvbWVfbWFpbi9ib290c3RyYXBNb2RlbHNfQ29yZC5wbmciLCB3aWR0aD0yNDAwLCBoZWlnaHQ9MTgwMCwgcmVzPTMwMCkKZ3JpZEV4dHJhOjpncmlkLmFycmFuZ2UoZzFfQ29yZF9JVFVfbiwgZzJfQ29yZF9JVFVfbiwgbmNvbCA9IDEpCmRldi5vZmYoKQpgYGAKYGBge3J9CnBuZyhmaWxlbmFtZT0iUmVzdWx0cy9GaWd1cmVzL2VsYXN0aWNOZXRfc2luZ2xlVGlzc3Vlcy9PdXRjb21lX21haW4vTW9kZWxfQ29yZC5wbmciLCB3aWR0aD0yODAwLCBoZWlnaHQ9MTQwMCwgcmVzPTQwMCkKZzFfQ29yZF9JVFVfbgpkZXYub2ZmKCkKYGBgCgoKYGBge3J9CmVsYm93X2ZpbmRlcihjc3VtbWFyeV9Db3JkX0lUVV9uJG56ZXJvLCBjc3VtbWFyeV9Db3JkX0lUVV9uJG1lZGlhbl9jdm0pCgpuemVyb19pbmRpY2VzX0NvcmQgPC0gZGF0YS5mcmFtZSh0KGVsYm93X2ZpbmRlcihjc3VtbWFyeV9Db3JkX0lUVV9uJG56ZXJvLCBjc3VtbWFyeV9Db3JkX0lUVV9uJG1lZGlhbl9jdm0pKSkKY29sbmFtZXMobnplcm9faW5kaWNlc19Db3JkKSA8LSBjKCJ4IiwgInkiKQpyb3duYW1lcyhuemVyb19pbmRpY2VzX0NvcmQpIDwtIE5VTEwKYGBgCmBgYHtyfQpuemVyb19maW5hbF9jb3JkX2l0dSA8LSA5CmBgYAoKbG9vayBhdCBtb2RlbHMgd2l0aCA5IG5vbi16ZXJvIGNvZWZmaWNpZW50LgpgYGB7cn0KY3N1bW1hcnlfQ29yZF9JVFVfbltuemVybyAlaW4lIG56ZXJvX2ZpbmFsX2NvcmRfaXR1XQpgYGAKCmBgYHtyfQpub256ZXJvX2Nob29zZV9Db3JkIDwtIGdncGxvdDI6OmdncGxvdChjc3VtbWFyeV9Db3JkX0lUVV9uKSArCiAgZ2dwbG90Mjo6dGhlbWVfYncoKSsKICBnZ3Bsb3QyOjphZXMoeCA9IG56ZXJvLCB5ID0gbWVkaWFuX2N2bSkgKwogIGdncGxvdDI6OnNjYWxlX3hfY29udGludW91cyhicmVha3M9YygwOjE3KSkrCiAgZ2dwbG90Mjo6Z2VvbV9wb2ludCgpICsgZ2dwbG90Mjo6Z2VvbV9saW5lKCkrCiAgZ2dwbG90Mjo6Z2VvbV9wb2ludChkYXRhPW56ZXJvX2luZGljZXNfQ29yZCwgYWVzKHg9eCwgeT15KSwgY29sb3VyPSJyZWQiLCBzaXplPTIpKwogIGdncGxvdDI6OnlsYWIoIm1lZGlhbiBjdm0gb3ZlciBib290c3RyYXBzXG4iKSsKICBnZ3Bsb3QyOjp4bGFiKCJcbm51bWJlciBvZiBub24temVybyBjb2VmZmljaWVudHMiKSsKICBnZ3Bsb3QyOjpnZW9tX3NlZ21lbnQoYWVzKHggPSBuemVyb1sxXSwgeSA9IG1lZGlhbl9jdm1bMV0sIHhlbmQgPSBuemVyb1sxNF0sIHllbmQgPSBtZWRpYW5fY3ZtWzE0XSwgY29sb3VyID0gInNlZ21lbnQiKSwgZGF0YSA9IGNzdW1tYXJ5X0NvcmRfSVRVX24sIHNob3cubGVnZW5kID0gRikrCiAgZ2dwbG90Mjo6dGhlbWUodGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTUpLCBheGlzLnRpdGxlLng9IGVsZW1lbnRfdGV4dChzaXplPTE1KSwgYXhpcy50aXRsZS55PSBlbGVtZW50X3RleHQoc2l6ZT0xNSkpCiAgCm5vbnplcm9fY2hvb3NlX0NvcmQKYGBgCgpgYGB7cn0KcG5nKGZpbGVuYW1lPSJSZXN1bHRzL0ZpZ3VyZXMvZWxhc3RpY05ldF9zaW5nbGVUaXNzdWVzL091dGNvbWVfbWFpbi9uemVyb19jaG9vc2VfQ29yZC5wbmciLCB3aWR0aD0yMjAwLCBoZWlnaHQ9MTQwMCwgcmVzPTQwMCkKbm9uemVyb19jaG9vc2VfQ29yZApkZXYub2ZmKCkKYGBgCmxvb2sgYXQgbW9kZWxzIHdpdGggOSBub24temVybyBjb2VmZmljaWVudHMuCmZpbHRlciBmb3IgY3V0LW9mZiA3NSUgLT4gd2hpY2ggdmFyaWFibGVzIG9jY3VyIGluIG1vcmUgdGhhbiA3NSUgb2YgbW9kZWxzLgoKYGBge3J9CnN1bW1hcnlfQ29yZF9JVFVfbl9maW5hbG56ZXJvIDwtIGNzdW1tYXJ5X0NvcmRfSVRVX25bbnplcm8gJWluJSBuemVyb19maW5hbF9jb3JkX2l0dV0Kc2lnX3Zhcl9uYW1lc19Db3JkX0lUVV9uX2ZpbmFsbnplcm8gPC0gRmlsdGVyKGZ1bmN0aW9uKHgpIGFueSh4ID4gMC43NSksIHN1bW1hcnlfQ29yZF9JVFVfbl9maW5hbG56ZXJvWywhYygibnplcm8iLCAibWVhbl9jdm0iLCAibWVkaWFuX2N2bSIpXSkgJT4lIGNvbG5hbWVzKCkKY29sbmFtZXMoc3VtbWFyeV9Db3JkX0lUVV9uX2ZpbmFsbnplcm8pIDwtIGMoIm5vbi16ZXJvIiwgImNoaWxkIHNleCAoZmVtYWxlKSIsICJiaXJ0aCB3ZWlnaHQiLCAiYmlydGggbGVuZ3RoIiwgImhlYWQgY2lyY3VtZmVyZW5jZSIsICJkZWxpdmVyeSBtb2RlIChhaWRlZCkiLCAiaW5kdWNlZCBsYWJvciAoeWVzKSIsICJwYXJpdHkgKGJpcnRoIGJlZm9yZSkiLCAibWF0ZXJuYWwgYWdlIiwgIm1hdGVybmFsIEJNSSIsICJtYXRlcm5hbCBoeXBlcnRlbnNpb24gKHllcykiLCAibWF0ZXJuYWwgZGlhYmV0ZXMgKHllcykiLCAibWF0ZXJuYWwgbWVudGFsIGRpc29yZGVycyAoeWVzKSIsICJtYXRlcm5hbCBzbW9raW5nICh5ZXMpIiwgIm1lYW4gY3ZtIiwgIm1lZGlhbiBjdm0iKQpzdW1tYXJ5X0NvcmRfSVRVX25fZmluYWxuemVyb1QgPC0gYXMuZGF0YS5mcmFtZSh0KHN1bW1hcnlfQ29yZF9JVFVfbl9maW5hbG56ZXJvWywtYygibm9uLXplcm8iLCAibWVkaWFuIGN2bSIsICJtZWFuIGN2bSIpXSkpCnN1bW1hcnlfQ29yZF9JVFVfbl9maW5hbG56ZXJvVCR2YXJpYWJsZSA8LSByb3duYW1lcyhzdW1tYXJ5X0NvcmRfSVRVX25fZmluYWxuemVyb1QpCnJvd25hbWVzKHN1bW1hcnlfQ29yZF9JVFVfbl9maW5hbG56ZXJvVCkgPC0gTlVMTApuYW1lcyhzdW1tYXJ5X0NvcmRfSVRVX25fZmluYWxuemVyb1QpW25hbWVzKHN1bW1hcnlfQ29yZF9JVFVfbl9maW5hbG56ZXJvVCkgPT0gJ1YxJ10gPC0gJ3BlcmNlbnQnCnN1bW1hcnlfQ29yZF9JVFVfbl9maW5hbG56ZXJvVCA8LSBzdW1tYXJ5X0NvcmRfSVRVX25fZmluYWxuemVyb1Rbb3JkZXIoc3VtbWFyeV9Db3JkX0lUVV9uX2ZpbmFsbnplcm9UJHBlcmNlbnQpLF0KCnN1bW1hcnlfQ29yZF9JVFVfbl9maW5hbG56ZXJvVCRudW1iZXIgPC0gc2VxKDEsIGxlbmd0aChzdW1tYXJ5X0NvcmRfSVRVX25fZmluYWxuemVyb1QkdmFyaWFibGUpKQpgYGAKCmBgYHtyLCBmaWcud2lkdGg9OH0KcGVyY192YXJzX0NvcmRfSVRVX24gPC0gCiAgZ2dwbG90KHN1bW1hcnlfQ29yZF9JVFVfbl9maW5hbG56ZXJvVCwgYWVzKHJlb3JkZXIodmFyaWFibGUsIHBlcmNlbnQpLCBwZXJjZW50LCBncm91cD0xKSkrCiAgZ2VvbV9wb2ludCgpKyBnZW9tX2xpbmUoKSsKICB5bGFiKCJcbiUgb2NjdXJlbmNlIGluIG1vZGVscyB3aXRoIG56ZXJvIGNvZWZmaWNpZW50cyA9IDkgICAgIikrCiAgc2NhbGVfeV9jb250aW51b3VzKGJyZWFrcz1jKDAuMSwwLjIsMC4zLDAuNCwwLjUsMC42LDAuNywwLjgsMC45KSkrCiAgeGxhYigicHJlZGljdG9yXG4iKSsKICBjb29yZF9mbGlwKCkrCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0PTAuNzUsIGxpbmV0eXBlPSJkb3R0ZWQiKSsKICB0aGVtZV9idygpKwogIHRoZW1lKHRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE1KSwgYXhpcy50aXRsZS54PSBlbGVtZW50X3RleHQoc2l6ZT0xNSksIGF4aXMudGl0bGUueT0gZWxlbWVudF90ZXh0KHNpemU9MTUpKQoKcGVyY192YXJzX0NvcmRfSVRVX24KCiMgZGVjaWRlIGZvciBjdXQtb2ZmICUgLT4gaGVyZSAuNzUKCkZpbHRlcihmdW5jdGlvbih4KSBhbnkoeCA+IDAuNzUpLCBzdW1tYXJ5X0NvcmRfSVRVX25fZmluYWxuemVyb1ssIWMoIm5vbi16ZXJvIiwgIm1lYW4gY3ZtIiwgIm1lZGlhbiBjdm0iKV0pCgpgYGAKCgpgYGB7cn0KcG5nKGZpbGVuYW1lPSJSZXN1bHRzL0ZpZ3VyZXMvZWxhc3RpY05ldF9zaW5nbGVUaXNzdWVzL091dGNvbWVfbWFpbi92YXJzUGVyY2VudF9Db3JkLnBuZyIsIHdpZHRoPTI5MDAsIGhlaWdodD0xNDAwLCByZXM9NDAwKQpwZXJjX3ZhcnNfQ29yZF9JVFVfbgpkZXYub2ZmKCkKYGBgCgpBIG1ldHJpYyBvZiBpbnRlcmVzdCBjb3VsZCBiZSB0aGUgd2lkdGggb2YgdGhlIGNvbmZpZGVuY2UgaW50ZXJ2YWxzIGFib3V0IGEgYm9vdHN0cmFwcGVkIGVzdGltYXRlIG9mIHRoZSBjb2VmZmljaWVudCwgd2hlbiB0aGUgY29lZmZpY2llbnQgaXMgbm9uLXplcm86CiAgCmBgYHtyfQpwbTJfQ29yZF9JVFVfbl9jb2VmIDwtCiAgZGNhc3QocG0yX0NvcmRfSVRVX25bLAogICAgICAgICAgICAgICAgICAgICAgIGFzLmxpc3QodW5saXN0KAogICAgICAgICAgICAgICAgICAgICAgICAgbGFwcGx5KC5TRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbih4KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5IDwtIHVubmFtZShxdWFudGlsZSh4W3ggIT0gMF0sIHByb2JzID0gYygwLjAyNSwgMC45NzUpKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3QoIm5vbl96ZXJvIiA9IDEwMCAqIG1lYW4oeCAhPSAwKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGNsID0geVsxXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWNsID0geVsyXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGggPSBkaWZmKHkpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYW4gPSBtZWRpYW4oeFt4IT0gMF0pKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKSksCiAgICAgICAgICAgICAgICAgICAgICAgLlNEY29scyA9IGMoIkNoaWxkX1NleGZlbWFsZSIsICJDaGlsZF9CaXJ0aF9XZWlnaHQiLCAiQ2hpbGRfQmlydGhfTGVuZ3RoIiwgIkNoaWxkX0hlYWRfQ2lyY3VtZmVyZW5jZV9BdF9CaXJ0aCIsICJEZWxpdmVyeV9tb2RlX2RpY2hvdG9tYWlkZWQiLCAiSW5kdWNlZF9MYWJvdXJ5ZXMiLCAiUGFyaXR5X2RpY2hvdG9tZ2l2ZW4gYmlydGggYmVmb3JlIiwgIk1hdGVybmFsX0FnZV9ZZWFycyIsICJNYXRlcm5hbF9Cb2R5X01hc3NfSW5kZXhfaW5fRWFybHlfUHJlZ25hbmN5IiwgIk1hdGVybmFsX0h5cGVydGVuc2lvbl9kaWNob3RvbWh5cGVydGVuc2lvbiBpbiBjdXJyZW50IHByZWduYW5jeSIsICJNYXRlcm5hbF9EaWFiZXRlc19kaWNob3RvbWRpYWJldGVzIGluIGN1cnJlbnQgcHJlZ25hbmN5IiwgIk1hdGVybmFsX01lbnRhbF9EaXNvcmRlcnNZZXMiLCAic21va2luZ19kaWNob3RvbXllcyIpLAogICAgICAgICAgICAgICAgICAgICAgIGJ5ID0gbnplcm9dW29yZGVyKG56ZXJvKV0gJT4lCiAgICAgICAgICBtZWx0KGlkLnZhciA9ICJuemVybyIpICU+JQogICAgICAgICAgLlssIG1ldHJpYyA6PSBzdWIoIl4uK1xcLiguKykkIiwgIlxcMSIsIHZhcmlhYmxlKV0gJT4lCiAgICAgICAgICAuWywgdmFyaWFibGUgOj0gc3ViKCJeKC4rKVxcLi4rJCIsICJcXDEiLCB2YXJpYWJsZSldICU+JQogICAgICAgICAgLltuemVybyA9PW56ZXJvX2ZpbmFsX2NvcmRfaXR1XSwgbnplcm8rIHZhcmlhYmxlIH4gbWV0cmljLCB2YWx1ZS52YXI9InZhbHVlIikKCiMgZ2V0IGRlc2lyZWQgb3JkZXIgb2YgcHJlZGljdG9ycwpwbTJfQ29yZF9JVFVfbl9jb2VmIDwtCiAgcG0yX0NvcmRfSVRVX25fY29lZlttYXRjaChjKCJDaGlsZF9TZXhmZW1hbGUiLCAiQ2hpbGRfQmlydGhfV2VpZ2h0IiwgIkNoaWxkX0JpcnRoX0xlbmd0aCIsICJDaGlsZF9IZWFkX0NpcmN1bWZlcmVuY2VfQXRfQmlydGgiLCAiRGVsaXZlcnlfbW9kZV9kaWNob3RvbWFpZGVkIiwgIkluZHVjZWRfTGFib3VyeWVzIiwgIlBhcml0eV9kaWNob3RvbWdpdmVuIGJpcnRoIGJlZm9yZSIsICJNYXRlcm5hbF9BZ2VfWWVhcnMiLCAiTWF0ZXJuYWxfQm9keV9NYXNzX0luZGV4X2luX0Vhcmx5X1ByZWduYW5jeSIsICJNYXRlcm5hbF9IeXBlcnRlbnNpb25fZGljaG90b21oeXBlcnRlbnNpb24gaW4gY3VycmVudCBwcmVnbmFuY3kiLCAiTWF0ZXJuYWxfRGlhYmV0ZXNfZGljaG90b21kaWFiZXRlcyBpbiBjdXJyZW50IHByZWduYW5jeSIsICJNYXRlcm5hbF9NZW50YWxfRGlzb3JkZXJzWWVzIiwgInNtb2tpbmdfZGljaG90b215ZXMiKSwgcG0yX0NvcmRfSVRVX25fY29lZiR2YXJpYWJsZSksXQpwbTJfQ29yZF9JVFVfbl9jb2VmJHZhcmlhYmxlIDwtIGZhY3RvcihwbTJfQ29yZF9JVFVfbl9jb2VmJHZhcmlhYmwsIGxldmVscz11bmlxdWUocG0yX0NvcmRfSVRVX25fY29lZiR2YXJpYWJsZSkpCgojIyBOT1RFOiBtZWRpYW4gaXMgdXNlZCBoZXJlIGluc3RlYWQgb2YgbWVhbgojIG1ha2UgZnJhbWUgZm9yIG9ubHkgc2lnbmlmaWNhbnQgdmFyaWFibGVzOgpwbTJfQ29yZF9JVFVfbl9kYXRhYmxlIDwtIGRjYXN0KHBtMl9Db3JkX0lUVV9uWywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcy5saXN0KHVubGlzdCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcHBseSguU0QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24oeCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeSA8LSB1bm5hbWUocXVhbnRpbGUoeFt4ICE9IDBdLCBwcm9icyA9IGMoMC4wMjUsIDAuOTc1KSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0KCJub25femVybyIgPSAxMDAgKiBtZWFuKHggIT0gMCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxjbCA9IHlbMV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVjbCA9IHlbMl0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoID0gZGlmZih5KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFuID0gbWVkaWFuKHhbeCE9IDBdKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSkpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5TRGNvbHMgPSBjKCJDaGlsZF9TZXhmZW1hbGUiLCAiQ2hpbGRfQmlydGhfV2VpZ2h0IiwgIkNoaWxkX0JpcnRoX0xlbmd0aCIsICJDaGlsZF9IZWFkX0NpcmN1bWZlcmVuY2VfQXRfQmlydGgiLCAiRGVsaXZlcnlfbW9kZV9kaWNob3RvbWFpZGVkIiwgIkluZHVjZWRfTGFib3VyeWVzIiwgIlBhcml0eV9kaWNob3RvbWdpdmVuIGJpcnRoIGJlZm9yZSIsICJNYXRlcm5hbF9BZ2VfWWVhcnMiLCAiTWF0ZXJuYWxfQm9keV9NYXNzX0luZGV4X2luX0Vhcmx5X1ByZWduYW5jeSIsICJNYXRlcm5hbF9IeXBlcnRlbnNpb25fZGljaG90b21oeXBlcnRlbnNpb24gaW4gY3VycmVudCBwcmVnbmFuY3kiLCAiTWF0ZXJuYWxfRGlhYmV0ZXNfZGljaG90b21kaWFiZXRlcyBpbiBjdXJyZW50IHByZWduYW5jeSIsICJNYXRlcm5hbF9NZW50YWxfRGlzb3JkZXJzWWVzIiwgInNtb2tpbmdfZGljaG90b215ZXMiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieSA9IG56ZXJvXVtvcmRlcihuemVybyldICU+JQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVsdChpZC52YXIgPSAibnplcm8iKSAlPiUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5bLCBtZXRyaWMgOj0gc3ViKCJeLitcXC4oLispJCIsICJcXDEiLCB2YXJpYWJsZSldICU+JQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLlssIHZhcmlhYmxlIDo9IHN1YigiXiguKylcXC4uKyQiLCAiXFwxIiwgdmFyaWFibGUpXSAlPiUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgcHJpbnQgJT4lCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuW256ZXJvID09IG56ZXJvX2ZpbmFsX2NvcmRfaXR1ICYgdmFyaWFibGUgJWluJSBzaWdfdmFyX25hbWVzX0NvcmRfSVRVX25fZmluYWxuemVyb10sIG56ZXJvKyB2YXJpYWJsZSB+IG1ldHJpYywgdmFsdWUudmFyPSJ2YWx1ZSIpCgpwbTJfQ29yZF9JVFVfbl9kYXRhYmxlCgpgYGAKCmBgYHtyfQp3cml0ZV94bHN4KHBtMl9Db3JkX0lUVV9uX2NvZWYsIlJlc3VsdHMvVGFibGVzL0NvZWZmaWNpZW50c01vZGVsX0NvcmQueGxzeCIpCmBgYAoKCmBgYHtyfQpzaWdfdmFyc19Db3JkX0lUVV9uIDwtCiAgcG0yX0NvcmRfSVRVX25fY29lZiAlPiUKICBnZ3Bsb3QyOjpnZ3Bsb3QoLikgKwogIGdncGxvdDI6OnRoZW1lX2J3KCkgKwogIGdncGxvdDI6OnRoZW1lKGF4aXMudGV4dC54PWVsZW1lbnRfYmxhbmsoKSkrCiAgZ2dwbG90Mjo6YWVzKHg9Im56ZXJvIikrCiAgZ2dwbG90Mjo6Z2VvbV9wb2ludChtYXBwaW5nID0gZ2dwbG90Mjo6YWVzKHkgPSB2YXJpYWJsZSwgc2l6ZSA9bm9uX3plcm8sIGFscGhhID0gbm9uX3plcm8sIGNvbG9yID0gbm9uX3plcm8pKSArCiAgZ2dwbG90Mjo6Z2VvbV90ZXh0KGFlcyh5PXZhcmlhYmxlLCBsYWJlbD1zcHJpbnRmKCIlMC4yZiIsIHJvdW5kKG1lZGlhbiwgZGlnaXRzPTIpKSwgc2l6ZT01MCksaGp1c3Q9MCwgdmp1c3Q9MC41LCBudWRnZV94ID0gMC4xKSsKICBnZ3Bsb3QyOjpzY2FsZV9jb2xvcl9ncmFkaWVudDIoaGlnaCA9ICdncmVlbicsIG1pZCA9ICJwdXJwbGUiLCBsb3cgPSAiYmxhY2siLCBtaWRwb2ludCA9NTApKwogIGdncGxvdDI6OnNjYWxlX2FscGhhKGd1aWRlID0gJ25vbmUnKSsKICBnZ3Bsb3QyOjpzY2FsZV9zaXplKGd1aWRlID0gJ25vbmUnKSsKICBnZ3Bsb3QyOjpzY2FsZV95X2Rpc2NyZXRlKGxhYmVscz0gYygiY2hpbGQgc2V4IChmZW1hbGUpIiwgImJpcnRoIHdlaWdodCIsICJiaXJ0aCBsZW5ndGgiLCAiaGVhZCBjaXJjdW1mZXJlbmNlIiwgImRlbGl2ZXJ5IG1vZGUgKGFpZGVkKSIsICJpbmR1Y2VkIGxhYm9yICh5ZXMpIiwgInBhcml0eSAoYmlydGggYmVmb3JlKSIsICJtYXRlcm5hbCBhZ2UiLCAibWF0ZXJuYWwgQk1JIiwgIm1hdGVybmFsIGh5cGVydGVuc2lvbiAoeWVzKSIsICJtYXRlcm5hbCBkaWFiZXRlcyAoeWVzKSIsICJtYXRlcm5hbCBtZW50YWwgZGlzb3JkZXJzICh5ZXMpIiwgIm1hdGVybmFsIHNtb2tpbmcgKHllcykiKSkrCiAgZ2dwbG90Mjo6bGFicyh5PSJwcmVkaWN0b3IiLCB4ID0gIm51bWJlciBvZiBub24temVybyBjb2VmZmljaWVudHMgPSA5IiwgY29sb3I9IiUiKQoKYGBgCgpgYGB7cn0KY29lZl9Db3JkX0lUVV9uIDwtIAogIGdncGxvdChwbTJfQ29yZF9JVFVfbl9jb2VmLCBhZXMoeSA9IHZhcmlhYmxlLCB4PW1lZGlhbikpKwogIGdlb21fcG9pbnQobWFwcGluZyA9IGdncGxvdDI6OmFlcyh5ID0gdmFyaWFibGUsIHNpemUgPW5vbl96ZXJvLCBhbHBoYSA9IG5vbl96ZXJvLCBjb2xvciA9IG5vbl96ZXJvKSkrCiAgc2NhbGVfY29sb3JfZ3JhZGllbnQyKGhpZ2ggPSAnZ3JlZW4nLCBtaWQgPSAicHVycGxlIiwgbG93ID0gImJsYWNrIiwgbWlkcG9pbnQgPTUwLCBsaW1pdHM9YygwLDEwMCkpKwogIHNjYWxlX2FscGhhKGd1aWRlID0gJ25vbmUnKSsKICBzY2FsZV9zaXplKGd1aWRlID0gJ25vbmUnKSsKICBnZW9tX3BvaW50KCkrCiAgZ2VvbV9lcnJvcmJhcihhZXMoeSA9IHZhcmlhYmxlLCB4bWluID0gbGNsLCB4bWF4ID0gdWNsKSwgd2lkdGggPSAwLjIpKwogIGxhYnMoeT0icHJlZGljdG9yIiwgeCA9ICJcbm1lZGlhbiAmIDk1JSBDSSBvZiBjb2VmZmljaWVudCAob3ZlciBib290c3RyYXBzKSIsIGNvbG9yPSIlIikrCiAgc2NhbGVfeF9jb250aW51b3VzKGxpbWl0cz1jKC0wLjQsMC40KSwgYnJlYWtzPWMoLS40LC0uMywtLjIsIC0uMSwgMCwgLjEsIC4yLCAuMywgLjQpKSsKICBzY2FsZV95X2Rpc2NyZXRlKGxhYmVscz0gYygiY2hpbGQgc2V4IChmZW1hbGUpIiwgImJpcnRoIHdlaWdodCIsICJiaXJ0aCBsZW5ndGgiLCAiaGVhZCBjaXJjdW1mZXJlbmNlIiwgImRlbGl2ZXJ5IG1vZGUgKGFpZGVkKSIsICJpbmR1Y2VkIGxhYm9yICh5ZXMpIiwgInBhcml0eSAoYmlydGggYmVmb3JlKSIsICJtYXRlcm5hbCBhZ2UiLCAibWF0ZXJuYWwgQk1JIiwgIm1hdGVybmFsIGh5cGVydGVuc2lvbiAoeWVzKSIsICJtYXRlcm5hbCBkaWFiZXRlcyAoeWVzKSIsICJtYXRlcm5hbCBtZW50YWwgZGlzb3JkZXJzICh5ZXMpIiwgIm1hdGVybmFsIHNtb2tpbmcgKHllcykiKSkrCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0PTAsIGxpbmV0eXBlPSJkYXNoZWQiKSsKICB0aGVtZV9idygpKwogIHRoZW1lKHRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE1KSwgYXhpcy50aXRsZS54PSBlbGVtZW50X3RleHQoc2l6ZT0xNSksIGF4aXMudGl0bGUueT0gZWxlbWVudF90ZXh0KHNpemU9MTUpKQoKCmNvZWZfQ29yZF9JVFVfbiAKYGBgCgoKYGBge3J9CnBuZyhmaWxlbmFtZT0iUmVzdWx0cy9GaWd1cmVzL2VsYXN0aWNOZXRfc2luZ2xlVGlzc3Vlcy9PdXRjb21lX21haW4vY29lZl9Db3JkLnBuZyIsIHdpZHRoPTI4MDAsIGhlaWdodD0xNDAwLCByZXM9NDAwKQpjb2VmX0NvcmRfSVRVX24gCmRldi5vZmYoKQpgYGAKCgpgYGB7cn0KcDEgPC0KICBjc3VtbWFyeV9Db3JkX0lUVV9uICU+JQogIG1lbHQoaWQudmFycyA9IGMoIm56ZXJvIiwgIm1lYW5fY3ZtIiwgIm1lZGlhbl9jdm0iKSkgJT4lCiAgZ2dwbG90Mjo6Z2dwbG90KC4pICsKICBnZ3Bsb3QyOjp0aGVtZV9idygpICsKICBnZ3Bsb3QyOjphZXMoeCA9IG56ZXJvKSArCiAgZ2dwbG90Mjo6Z2VvbV9wb2ludChtYXBwaW5nID0gZ2dwbG90Mjo6YWVzKHkgPSB2YXJpYWJsZSwgc2l6ZSA9IHZhbHVlLCBhbHBoYSA9IHZhbHVlLCBjb2xvciA9IHZhbHVlKjEwMCkpICsKICBnZ3Bsb3QyOjpzY2FsZV9jb2xvcl9ncmFkaWVudDIoaGlnaCA9ICdncmVlbicsIG1pZCA9ICJwdXJwbGUiLCBsb3cgPSAiYmxhY2siLCBtaWRwb2ludCA9NTApKwogIGdncGxvdDI6OnNjYWxlX2FscGhhKGd1aWRlID0gJ25vbmUnKSsKICBnZ3Bsb3QyOjpzY2FsZV9zaXplKGd1aWRlID0gJ25vbmUnKSsKICBnZ3Bsb3QyOjpzY2FsZV95X2Rpc2NyZXRlKGxhYmVscz0gYygiY2hpbGQgc2V4IChmZW1hbGUpIiwgImJpcnRoIHdlaWdodCIsICJiaXJ0aCBsZW5ndGgiLCAiaGVhZCBjaXJjdW1mZXJlbmNlIiwgImRlbGl2ZXJ5IG1vZGUgKGFpZGVkKSIsICJpbmR1Y2VkIGxhYm9yICh5ZXMpIiwgInBhcml0eSAoYmlydGggYmVmb3JlKSIsICJtYXRlcm5hbCBhZ2UiLCAibWF0ZXJuYWwgQk1JIiwgIm1hdGVybmFsIGh5cGVydGVuc2lvbiAoeWVzKSIsICJtYXRlcm5hbCBkaWFiZXRlcyAoeWVzKSIsICJtYXRlcm5hbCBtZW50YWwgZGlzb3JkZXJzICh5ZXMpIiwgIm1hdGVybmFsIHNtb2tpbmcgKHllcykiKSkrCiAgZ2dwbG90Mjo6c2NhbGVfeF9jb250aW51b3VzKGJyZWFrcz0wOjE0LCBsYWJlbHM9KSsKICBnZ3Bsb3QyOjpsYWJzKHk9InByZWRpY3RvclxuIiwgeCA9ICJcbm51bWJlciBvZiBub24temVybyBjb2VmZmljaWVudHMiLCBjb2xvcj0iJSIpKwogIGdncGxvdDI6OnRoZW1lKHRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE3KSwgYXhpcy50aXRsZS54PSBlbGVtZW50X3RleHQoc2l6ZT0xNSksIGF4aXMudGl0bGUueT0gZWxlbWVudF90ZXh0KHNpemU9MTUpLCBsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpCiAgCnAyIDwtIAogIGdncGxvdChwbTJfQ29yZF9JVFVfbl9jb2VmLCBhZXMoeSA9IHZhcmlhYmxlLCB4PW1lZGlhbikpKwogIGdlb21fcG9pbnQobWFwcGluZyA9IGdncGxvdDI6OmFlcyh5ID0gdmFyaWFibGUsIHNpemUgPW5vbl96ZXJvLCBhbHBoYSA9IG5vbl96ZXJvLCBjb2xvciA9IG5vbl96ZXJvKSkrCiAgc2NhbGVfY29sb3JfZ3JhZGllbnQyKGhpZ2ggPSAnZ3JlZW4nLCBtaWQgPSAicHVycGxlIiwgbG93ID0gImJsYWNrIiwgbWlkcG9pbnQgPTUwLCBsaW1pdHM9YygwLDEwMCkpKwogIHNjYWxlX2FscGhhKGd1aWRlID0gJ25vbmUnKSsKICBzY2FsZV9zaXplKGd1aWRlID0gJ25vbmUnKSsKICBnZW9tX3BvaW50KCkrCiAgZ2VvbV9lcnJvcmJhcihhZXMoeSA9IHZhcmlhYmxlLCB4bWluID0gbGNsLCB4bWF4ID0gdWNsKSwgd2lkdGggPSAwLjIpKwogIGxhYnMoeT0iIiwgeCA9ICJcbm1lZGlhbiAmIDk1JSBDSSBvZiBjb2VmZmljaWVudCAob3ZlciBib290c3RyYXBzKSIsIGNvbG9yPSIlIikrCiAgc2NhbGVfeF9jb250aW51b3VzKGxpbWl0cz1jKC0wLjQsMC40KSwgYnJlYWtzPWMoLS40LC0uMywtLjIsIC0uMSwgMCwgLjEsIC4yLCAuMywgLjQpKSsKICBzY2FsZV95X2Rpc2NyZXRlKGxhYmVscz0gYygiY2hpbGQgc2V4IChmZW1hbGUpIiwgImJpcnRoIHdlaWdodCIsICJiaXJ0aCBsZW5ndGgiLCAiaGVhZCBjaXJjdW1mZXJlbmNlIiwgImRlbGl2ZXJ5IG1vZGUgKGFpZGVkKSIsICJpbmR1Y2VkIGxhYm9yICh5ZXMpIiwgInBhcml0eSAoYmlydGggYmVmb3JlKSIsICJtYXRlcm5hbCBhZ2UiLCAibWF0ZXJuYWwgQk1JIiwgIm1hdGVybmFsIGh5cGVydGVuc2lvbiAoeWVzKSIsICJtYXRlcm5hbCBkaWFiZXRlcyAoeWVzKSIsICJtYXRlcm5hbCBtZW50YWwgZGlzb3JkZXJzICh5ZXMpIiwgIm1hdGVybmFsIHNtb2tpbmcgKHllcykiKSkrCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0PTAsIGxpbmV0eXBlPSJkYXNoZWQiKSsKICAgZ2d0aXRsZSgibnplcm8gPSA5IikrCiAgdGhlbWVfYncoKSsKIHRoZW1lKHRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE3KSwgYXhpcy50aXRsZS54PSBlbGVtZW50X3RleHQoc2l6ZT0xNSksIGF4aXMudGl0bGUueT0gZWxlbWVudF90ZXh0KHNpemU9MTUpLCBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MTUpLCBheGlzLnRleHQueT1lbGVtZW50X2JsYW5rKCkpCgpnMSA8LSBnZ3Bsb3RHcm9iKHAxKQpnMiA8LSBnZ3Bsb3RHcm9iKHAyKQpnIDwtIGNiaW5kKGcxLCBnMiwgc2l6ZSA9ICJsYXN0IikKZyRoZWlnaHRzIDwtIHVuaXQucG1heChnMSRoZWlnaHRzLCBnMiRoZWlnaHRzKQoKcG5nKGZpbGVuYW1lPSJSZXN1bHRzL0ZpZ3VyZXMvZWxhc3RpY05ldF9zaW5nbGVUaXNzdWVzL091dGNvbWVfbWFpbi9Nb2RlbF9jb2VmX0NvcmQucG5nIiwgd2lkdGg9NTgwMCwgaGVpZ2h0PTE2MDAsIHJlcz00MDApCmdyaWQuZHJhdyhnKQpkZXYub2ZmKCkKYGBgCgoKZ2V0IHRoZSBiZXRhIHZhbHVlcwoKYGBge3J9CiMjIyBDb2RlIGZvciBvbmx5IGluY2x1ZGluZyAic2lnbmlmaWNhbnQgdmFyaWFibGVzIiBpbiB0aGUgYmV0YSB2ZWN0b3IsIGJhc2VkIG9uIFZJUCAoPjc1JSBub3QtemVybyBpbiBib290c3RyYXBzKQoKIyBnZXQgbWVkaWFuIGJldGEgdmFsdWVzIG9mIHRoZSAxMDAwIGJvb3RzdHJhcHMgZm9yIHRoZSBtb2RlbCB3aXRoIDkgbm9uLXplcm8gY29lZmZpY2llbnRzCkJldGFfaGF0X3NfY29yZF9uIDwtIG1hdHJpeChtaXNjVG9vbHM6OmNvbE1lZGlhbnMocG0yX0NvcmRfSVRVX25bbnplcm8gPT0gbnplcm9fZmluYWxfY29yZF9pdHUsIC5TRCwgLlNEY29scyA9IGMoIihJbnRlcmNlcHQpIixzaWdfdmFyX25hbWVzX0NvcmRfSVRVX25fZmluYWxuemVybyldKSwgbmNvbCA9IDEpCiMgaW50ZW5lcHQgYW5kIHZhcmlhYmxlIGJldGEgdmFsdWVzCiMgTk9URSB0aGF0IG1lZGlhbiBpcyB1c2VkIGhlcmUKcm93bmFtZXMoQmV0YV9oYXRfc19jb3JkX24pIDwtIGMoIkludGVyY2VwdCIsIHNpZ192YXJfbmFtZXNfQ29yZF9JVFVfbl9maW5hbG56ZXJvKQoKQmV0YV9Db3JkX0lUVV9uIDwtIEJldGFfaGF0X3NfY29yZF9uCmBgYAoKYGBge3J9CnNhdmUoQmV0YV9Db3JkX0lUVV9uLCBmaWxlPSJJbnB1dERhdGEvRGF0YV9FbGFzdGljTmV0cy9CZXRhX0NvcmRfSVRVX24uUmRhdGEiKQpgYGAKClt0byB0aGUgdG9wXSgjdG9wKQoKIyMgQ29yZCBibG9vZCBlbGFzdGljIG5ldCB7I2VsYXN0aWNuZXRDb3JkSVRVX2F9ICAKYWRkaXRpb25hbCBtb2RlbCwgd2l0aCBhbGNvaG9sIHZhcmlhYmxlCgpgYGB7cn0KIyBpbiBjYXNlIHlvdSB3YW50IHRvIHN0YXJ0IGZyb20gaGVyZQpsb2FkKCJJbnB1dERhdGEvQ2xvY2tDYWxjdWxhdGlvbnNJbnB1dC9SZWdfSW5wdXRfRGF0YV9Db3JkX0lUVV9FQUFSX25vTmFfd2EuUmRhdGEiKQpgYGAKCmBgYHtyfQp5cmNfbWF0X0lUVV9Db3JkX3dhIDwtIG1hdHJpeChSZWdfSW5wdXRfRGF0YV9Db3JkX0lUVV9FQUFSX25vTmFfd2EkRUFBUl9Cb2hsaW4pCnhyY19tYXRfSVRVX0NvcmRfd2EgPC0gbW9kZWwubWF0cml4KCB+IC4gLSBFQUFSX0JvaGxpbiwgZGF0YSA9IFJlZ19JbnB1dF9EYXRhX0NvcmRfSVRVX0VBQVJfbm9OYV93YSlbLCAtMV0KeXJjX21hdF9JVFVfc2NhbGVkX0NvcmRfd2EgPC0gc2NhbGUoeXJjX21hdF9JVFVfQ29yZF93YSkKeHJjX21hdF9JVFVfc2NhbGVkX0NvcmRfd2EgPC0gc2NhbGUoeHJjX21hdF9JVFVfQ29yZF93YSkKYGBgCgo8IS0tIHNldCBzZWVkIC0tPgo8IS0tIGBgYHtyfSAtLT4KPCEtLSBzZXQuc2VlZCgyMDIwKSAtLT4KPCEtLSBgYGAgLS0+CgoKPCEtLSBgYGB7ciwgd2FybmluZz1GfSAtLT4KPCEtLSAgIG5ib290ID0gMTAwMCAtLT4KCjwhLS0gICBzdGFydF90aW1lIDwtIFN5cy50aW1lKCkgLS0+CjwhLS0gICBib290c3RyYXBzX0NvcmRfSVRVX3dhIDwtIHJlcGxpY2F0ZShuYm9vdCwgeyAtLT4KPCEtLSAgICAgcndzIDwtIHNhbXBsZSgxOm5yb3coeHJjX21hdF9JVFVfc2NhbGVkX0NvcmRfd2EpLCByZXBsYWNlID0gVFJVRSkgLS0+CjwhLS0gICAgIGVuc3IoeHJjX21hdF9JVFVfc2NhbGVkX0NvcmRfd2FbcndzLCBdLCB5cmNfbWF0X0lUVV9zY2FsZWRfQ29yZF93YVtyd3MsIF0sIHN0YW5kYXJkaXplZCA9IEZBTFNFLCBmYW1pbHk9ImdhdXNzaWFuIiwgbmxhbWJkYT0xMDAsIG5mb2xkcz0xMCwgYWxwaGE9YygwLjAsMC4xLDAuMiwwLjMsMC40LDAuNSwwLjYsMC43LDAuOCwwLjksMS4wKSkgLS0+CjwhLS0gICB9LCAtLT4KPCEtLSAgIHNpbXBsaWZ5ID0gRkFMU0UpIC0tPgoKPCEtLSAgIGVuZF90aW1lIDwtIFN5cy50aW1lKCkgLS0+CjwhLS0gICBlbmRfdGltZSAtIHN0YXJ0X3RpbWUgLS0+Cgo8IS0tIGBgYCAtLT4KCjwhLS0gYGBge3J9IC0tPgo8IS0tIHNhdmUoYm9vdHN0cmFwc19Db3JkX0lUVV93YSwgZmlsZT0iSW5wdXREYXRhL0RhdGFfRWxhc3RpY05ldHMvYm9vdHN0cmFwc19Db3JkX0lUVV93YV8xMDAwLlJkYXRhIikgLS0+CjwhLS0gYGBgIC0tPgoKCmBgYHtyfQpsb2FkKCJJbnB1dERhdGEvRGF0YV9FbGFzdGljTmV0cy9ib290c3RyYXBzX0NvcmRfSVRVX3dhXzEwMDAuUmRhdGEiKQpgYGAKCmBgYHtyfQpzdW1tYXJpZXNfQ29yZF9JVFVfd2EgPC0KICBib290c3RyYXBzX0NvcmRfSVRVX3dhICU+JQogIGxhcHBseShzdW1tYXJ5KSAlPiUKICByYmluZGxpc3QoaWRjb2wgPSAiYm9vdHN0cmFwIikKCnN1bW1hcmllc19Db3JkX0lUVV93YQpgYGAKCmBgYHtyfQpzdW1tYXJpZXNfQ29yZF9JVFVfd2FbLCAuU0RbY3ZtID09IG1pbihjdm0pXSwgYnkgPSBjKCJib290c3RyYXAiLCAibnplcm8iKV0gJT4lCiAgZ2dwbG90Mjo6Z2dwbG90KGRhdGEgPSAuKSArCiAgZ2dwbG90Mjo6YWVzKHggPSBuemVybywgeSA9IGN2bSwgZ3JvdXAgPSBib290c3RyYXApICsKICBnZ3Bsb3QyOjpnZW9tX3BvaW50KCkgKwogIGdncGxvdDI6Omdlb21fbGluZSgpCmBgYAoKYGBge3J9CnBuZyhmaWxlbmFtZT0iUmVzdWx0cy9GaWd1cmVzL2VsYXN0aWNOZXRfc2luZ2xlVGlzc3Vlcy9PdXRjb21lX2FkZC9hbGNvaG9sL2Jvb3RzdHJhcHNfQ29yZC5wbmciLCB3aWR0aD04MDAsIGhlaWdodD02MDApCnN1bW1hcmllc19Db3JkX0lUVV93YVssIC5TRFtjdm0gPT0gbWluKGN2bSldLCBieSA9IGMoImJvb3RzdHJhcCIsICJuemVybyIpXSAlPiUKICBnZ3Bsb3QyOjpnZ3Bsb3QoZGF0YSA9IC4pICsKICBnZ3Bsb3QyOjphZXMoeCA9IG56ZXJvLCB5ID0gY3ZtLCBncm91cCA9IGJvb3RzdHJhcCkgKwogIGdncGxvdDI6Omdlb21fcG9pbnQoKSArCiAgZ2dwbG90Mjo6Z2VvbV9saW5lKCkKZGV2Lm9mZigpCmBgYAoKCjwhLS0gYGBge3IsIHdhcm5pbmc9RkFMU0V9IC0tPgo8IS0tICMgbG93ZXN0IGN2bSBieSBib290c3RyYXAgYW5kIG56ZXJvIC0tPgo8IS0tIHBtX0NvcmRfSVRVX3dhIDwtIHN1bW1hcmllc19Db3JkX0lUVV93YVssIC5TRFtjdm0gPT0gbWluKGN2bSldLCBieSA9IGMoImJvb3RzdHJhcCIsICJuemVybyIpXSAtLT4KPCEtLSBwbTJfQ29yZF9JVFVfd2EgPC0gTlVMTCAtLT4KCjwhLS0gZm9yKGkgaW4gYXMuaW50ZWdlcihzZXEoMSwgbnJvdyhwbV9Db3JkX0lUVV93YSksIGJ5ID0gMSkpKSB7IC0tPgo8IS0tICAgcG0yX0NvcmRfSVRVX3dhIDwtIHJiaW5kKHBtMl9Db3JkX0lUVV93YSwgLS0+CjwhLS0gICAgICAgICAgICAgICAgY2JpbmQocG1fQ29yZF9JVFVfd2FbaSwgXSwgLS0+CjwhLS0gICAgICAgICAgICAgICAgdChhcy5tYXRyaXgoY29lZihib290c3RyYXBzX0NvcmRfSVRVX3dhW1twbV9Db3JkX0lUVV93YVtpLCBib290c3RyYXBdXV1bW3BtX0NvcmRfSVRVX3dhW2ksIGxfaW5kZXhdXV0sIHMgPSBwbV9Db3JkX0lUVV93YVtpLCBsYW1iZGFdKSkpIC0tPgo8IS0tICAgICAgICAgICAgICAgICkgLS0+CjwhLS0gICApIC0tPgo8IS0tIH0gLS0+Cgo8IS0tIHBtMl9Db3JkX0lUVV93YSAtLT4KPCEtLSBgYGAgLS0+CgoKPCEtLSBgYGB7cn0gLS0+CjwhLS0gIyBzYXZlICJwcmVmZXJhYmxlIG1vZGVscyIgLS0+CjwhLS0gc2F2ZShwbTJfQ29yZF9JVFVfd2EsIGZpbGU9IklucHV0RGF0YS9EYXRhX0VsYXN0aWNOZXRzL3BtMl9Db3JkX0lUVV93YS5SZGF0YSIpIC0tPgo8IS0tIGBgYCAtLT4KCgpgYGB7cn0KbG9hZCgiSW5wdXREYXRhL0RhdGFfRWxhc3RpY05ldHMvcG0yX0NvcmRfSVRVX3dhLlJkYXRhIikKIyBjb2VmZmljaWVudCB2YWx1ZXMgZm9yIHRoZSBtb2RlbHMgd2l0aCBzbWFsbGVzdCBjdm0gYnkgbnVtYmVyIG9mIG5vbi1lcnpvIGNvZWZmaWNpZW50cyBhbmQgYm9vdHN0cmFwCmBgYAoKYGBge3J9CmNzdW1tYXJ5X0NvcmRfSVRVX3dhIDwtIFJlZHVjZShmdW5jdGlvbih4LHkpIG1lcmdlKHggPSB4LCB5ID0geSwgYnkgPSAibnplcm8iKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0KHBtMl9Db3JkX0lUVV93YVssIGxhcHBseSguU0QsIGZ1bmN0aW9uKHgpIHttZWFuKHggIT0gMCl9KSwgLlNEY29scyA9IGMoIkNoaWxkX1NleGZlbWFsZSIsICJDaGlsZF9CaXJ0aF9XZWlnaHQiLCAiQ2hpbGRfQmlydGhfTGVuZ3RoIiwgIkNoaWxkX0hlYWRfQ2lyY3VtZmVyZW5jZV9BdF9CaXJ0aCIsICJEZWxpdmVyeV9tb2RlX2RpY2hvdG9tYWlkZWQiLCAiSW5kdWNlZF9MYWJvdXJ5ZXMiLCAiUGFyaXR5X2RpY2hvdG9tZ2l2ZW4gYmlydGggYmVmb3JlIiwgIk1hdGVybmFsX0FnZV9ZZWFycyIsICJNYXRlcm5hbF9Cb2R5X01hc3NfSW5kZXhfaW5fRWFybHlfUHJlZ25hbmN5IiwgIk1hdGVybmFsX0h5cGVydGVuc2lvbl9kaWNob3RvbWh5cGVydGVuc2lvbiBpbiBjdXJyZW50IHByZWduYW5jeSIsICJNYXRlcm5hbF9EaWFiZXRlc19kaWNob3RvbWRpYWJldGVzIGluIGN1cnJlbnQgcHJlZ25hbmN5IiwgIk1hdGVybmFsX01lbnRhbF9EaXNvcmRlcnNZZXMiLCAic21va2luZ19kaWNob3RvbXllcyIsICJtYXRlcm5hbF9hbGNvaG9sX3VzZXllcyIpLCBieSA9IG56ZXJvXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBtMl9Db3JkX0lUVV93YVssIC4obWVhbl9jdm0gPSBtZWFuKGN2bSkpLCBieSA9IG56ZXJvXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG0yX0NvcmRfSVRVX3dhWywgLihtZWRpYW5fY3ZtID0gbWVkaWFuKGN2bSkpLCBieSA9IG56ZXJvXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSlbb3JkZXIobnplcm8pXQoKY3N1bW1hcnlfQ29yZF9JVFVfd2EKYGBgCgoKYGBge3J9CmcxX0NvcmRfSVRVX3dhIDwtCiAgY3N1bW1hcnlfQ29yZF9JVFVfd2EgJT4lCiAgbWVsdChpZC52YXJzID0gYygibnplcm8iLCAibWVhbl9jdm0iLCAibWVkaWFuX2N2bSIpKSAlPiUKICBnZ3Bsb3QyOjpnZ3Bsb3QoLikgKwogIGdncGxvdDI6OnRoZW1lX2J3KCkgKwogIGdncGxvdDI6OmFlcyh4ID0gbnplcm8pICsKICBnZ3Bsb3QyOjpnZW9tX3BvaW50KG1hcHBpbmcgPSBnZ3Bsb3QyOjphZXMoeSA9IHZhcmlhYmxlLCBzaXplID0gdmFsdWUsIGFscGhhID0gdmFsdWUsIGNvbG9yID0gdmFsdWUqMTAwKSkgKwogIGdncGxvdDI6OnNjYWxlX2NvbG9yX2dyYWRpZW50MihoaWdoID0gJ2dyZWVuJywgbWlkID0gInB1cnBsZSIsIGxvdyA9ICJibGFjayIsIG1pZHBvaW50ID01MCkrCiAgZ2dwbG90Mjo6c2NhbGVfYWxwaGEoZ3VpZGUgPSAnbm9uZScpKwogIGdncGxvdDI6OnNjYWxlX3NpemUoZ3VpZGUgPSAnbm9uZScpKwogIGdncGxvdDI6OnNjYWxlX3lfZGlzY3JldGUobGFiZWxzPSBjKCJjaGlsZCBzZXgiLCAiYmlydGggd2VpZ2h0IiwgImJpcnRoIGxlbmd0aCIsICJoZWFkIGNpcmN1bWZlcmVuY2UiLCAiZGVsaXZlcnkgbW9kZSIsICJpbmR1Y2VkIGxhYm9yIiwgInBhcml0eSIsICJtYXRlcm5hbCBhZ2UiLCAibWF0ZXJuYWwgQk1JIiwgIm1hdGVybmFsIGh5cGVydGVuc2lvbiIsICJtYXRlcm5hbCBkaWFiZXRlcyIsICJtYXRlcm5hbCBtZW50YWwgZGlzb3JkZXJzIiwgIm1hdGVybmFsIHNtb2tpbmciLCAibWF0ZXJuYWwgYWxjb2hvbCB1c2UiKSkrCiAgZ2dwbG90Mjo6c2NhbGVfeF9jb250aW51b3VzKGJyZWFrcz0wOjE0LCBsYWJlbHM9KSsKICBnZ3Bsb3QyOjpsYWJzKHk9InByZWRpY3RvciIsIHggPSAibnVtYmVyIG9mIG5vbi16ZXJvIGNvZWZmaWNpZW50cyIsIGNvbG9yPSIlIikrCiAgZ2dwbG90Mjo6dGhlbWUodGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTUpLCBheGlzLnRpdGxlLng9IGVsZW1lbnRfdGV4dChzaXplPTE1KSwgYXhpcy50aXRsZS55PSBlbGVtZW50X3RleHQoc2l6ZT0xNSkpCgpnMl9Db3JkX0lUVV93YSA8LQogIGNzdW1tYXJ5X0NvcmRfSVRVX3dhICU+JQogIGdncGxvdDI6OmdncGxvdCguKSArCiAgZ2dwbG90Mjo6dGhlbWVfYncoKSArCiAgZ2dwbG90Mjo6YWVzKHggPSBuemVybywgeSA9IG1lZGlhbl9jdm0pICsKICBnZ3Bsb3QyOjpnZW9tX3BvaW50KCkgKyBnZ3Bsb3QyOjpnZW9tX2xpbmUoKSsKICBnZ3Bsb3QyOjpsYWJzKHk9Im1lZGlhbiBjdm0iLCB4ID0gIm51bWJlciBvZiBub24temVybyBjb2VmZmljaWVudHMiKSsKICBnZ3Bsb3QyOjpzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzPTA6MTQsIGxhYmVscz0pKwogIGdncGxvdDI6OnRoZW1lKGF4aXMudGV4dD1lbGVtZW50X3RleHQoc2l6ZT0xNSksYXhpcy50aXRsZT1lbGVtZW50X3RleHQoc2l6ZT0xOCkpCgpncmlkRXh0cmE6OmdyaWQuYXJyYW5nZShnMV9Db3JkX0lUVV93YSwgZzJfQ29yZF9JVFVfd2EsIG5jb2wgPSAxKQoKYGBgCgoKYGBge3J9CnBuZyhmaWxlbmFtZT0iUmVzdWx0cy9GaWd1cmVzL2VsYXN0aWNOZXRfc2luZ2xlVGlzc3Vlcy9PdXRjb21lX2FkZC9hbGNvaG9sL2Jvb3RzdHJhcE1vZGVsc19Db3JkLnBuZyIsIHdpZHRoPTI0MDAsIGhlaWdodD0xODAwLCByZXM9MzAwKQpncmlkRXh0cmE6OmdyaWQuYXJyYW5nZShnMV9Db3JkX0lUVV93YSwgZzJfQ29yZF9JVFVfd2EsIG5jb2wgPSAxKQpkZXYub2ZmKCkKYGBgCgpgYGB7cn0KcG5nKGZpbGVuYW1lPSJSZXN1bHRzL0ZpZ3VyZXMvZWxhc3RpY05ldF9zaW5nbGVUaXNzdWVzL091dGNvbWVfYWRkL2FsY29ob2wvTW9kZWxfQ29yZC5wbmciLCB3aWR0aD0yODAwLCBoZWlnaHQ9MTQwMCwgcmVzPTQwMCkKZzFfQ29yZF9JVFVfd2EKZGV2Lm9mZigpCmBgYAoKYGBge3J9CmVsYm93X2ZpbmRlcihjc3VtbWFyeV9Db3JkX0lUVV93YSRuemVybywgY3N1bW1hcnlfQ29yZF9JVFVfd2EkbWVkaWFuX2N2bSkKCm56ZXJvX2luZGljZXNfQ29yZCA8LSBkYXRhLmZyYW1lKHQoZWxib3dfZmluZGVyKGNzdW1tYXJ5X0NvcmRfSVRVX3dhJG56ZXJvLCBjc3VtbWFyeV9Db3JkX0lUVV93YSRtZWRpYW5fY3ZtKSkpCmNvbG5hbWVzKG56ZXJvX2luZGljZXNfQ29yZCkgPC0gYygieCIsICJ5IikKcm93bmFtZXMobnplcm9faW5kaWNlc19Db3JkKSA8LSBOVUxMCmBgYApgYGB7cn0Kbnplcm9fZmluYWxfY29yZF93YSA8LSA3CmBgYAoKbG9vayBhdCBtb2RlbHMgd2l0aCBmaW5hbCBub24temVybyBjb2VmZmljaWVudC4KYGBge3J9CmNzdW1tYXJ5X0NvcmRfSVRVX3dhW256ZXJvICVpbiUgbnplcm9fZmluYWxfY29yZF93YV0KYGBgCgpgYGB7cn0Kbm9uemVyb19jaG9vc2VfQ29yZCA8LSBnZ3Bsb3QyOjpnZ3Bsb3QoY3N1bW1hcnlfQ29yZF9JVFVfd2EpICsKICBnZ3Bsb3QyOjp0aGVtZV9idygpKwogIGdncGxvdDI6OmFlcyh4ID0gbnplcm8sIHkgPSBtZWRpYW5fY3ZtKSArCiAgZ2dwbG90Mjo6c2NhbGVfeF9jb250aW51b3VzKGJyZWFrcz1jKDA6MTcpKSsKICBnZ3Bsb3QyOjpnZW9tX3BvaW50KCkgKyBnZ3Bsb3QyOjpnZW9tX2xpbmUoKSsKICBnZ3Bsb3QyOjpnZW9tX3BvaW50KGRhdGE9bnplcm9faW5kaWNlc19Db3JkLCBhZXMoeD14LCB5PXkpLCBjb2xvdXI9InJlZCIsIHNpemU9MikrCiAgZ2dwbG90Mjo6eWxhYigibWVkaWFuIG9mIG1pbmltdW0gY3Jvc3MtdmFsaWRhdGlvbiBlcnJvcnMgb3ZlciBib290c3RyYXBzIikrCiAgZ2dwbG90Mjo6eGxhYigibnVtYmVyIG9mIG5vbi16ZXJvIGNvZWZmaWNpZW50cyIpKwogIGdncGxvdDI6Omdlb21fc2VnbWVudChhZXMoeCA9IG56ZXJvWzFdLCB5ID0gbWVkaWFuX2N2bVsxXSwgeGVuZCA9IG56ZXJvWzE1XSwgeWVuZCA9IG1lZGlhbl9jdm1bMTVdLCBjb2xvdXIgPSAic2VnbWVudCIpLCBkYXRhID0gY3N1bW1hcnlfQ29yZF9JVFVfd2EsIHNob3cubGVnZW5kID0gRikKCm5vbnplcm9fY2hvb3NlX0NvcmQKYGBgCgpgYGB7cn0KcG5nKGZpbGVuYW1lPSJSZXN1bHRzL0ZpZ3VyZXMvZWxhc3RpY05ldF9zaW5nbGVUaXNzdWVzL091dGNvbWVfYWRkL2FsY29ob2wvbnplcm9fY2hvb3NlX0NvcmQucG5nIiwgd2lkdGg9MTYwMCwgaGVpZ2h0PTE0MDAsIHJlcz0zMDApCm5vbnplcm9fY2hvb3NlX0NvcmQKZGV2Lm9mZigpCmBgYAoKYGBge3J9CnN1bW1hcnlfQ29yZF9JVFVfd2FfZmluYWxuemVybyA8LSBjc3VtbWFyeV9Db3JkX0lUVV93YVtuemVybyAlaW4lIG56ZXJvX2ZpbmFsX2NvcmRfd2FdCnNpZ192YXJfbmFtZXNfQ29yZF9JVFVfd2FfZmluYWxuemVybyA8LSBGaWx0ZXIoZnVuY3Rpb24oeCkgYW55KHggPiAwLjc1KSwgc3VtbWFyeV9Db3JkX0lUVV93YV9maW5hbG56ZXJvWywhYygibnplcm8iLCAibWVhbl9jdm0iLCAibWVkaWFuX2N2bSIpXSkgJT4lIGNvbG5hbWVzKCkKY29sbmFtZXMoc3VtbWFyeV9Db3JkX0lUVV93YV9maW5hbG56ZXJvKSA8LSBjKCJub24temVybyIsICJjaGlsZCBzZXggKGZlbWFsZSkiLCAiYmlydGggd2VpZ2h0IiwgImJpcnRoIGxlbmd0aCIsICJoZWFkIGNpcmN1bWZlcmVuY2UiLCAiZGVsaXZlcnkgbW9kZSAoYWlkZWQpIiwgImluZHVjZWQgbGFib3IgKHllcykiLCAicGFyaXR5IChiaXJ0aCBiZWZvcmUpIiwgIm1hdGVybmFsIGFnZSIsICJtYXRlcm5hbCBCTUkiLCAibWF0ZXJuYWwgaHlwZXJ0ZW5zaW9uICh5ZXMpIiwgIm1hdGVybmFsIGRpYWJldGVzICh5ZXMpIiwgIm1hdGVybmFsIG1lbnRhbCBkaXNvcmRlcnMgKHllcykiLCAibWF0ZXJuYWwgc21va2luZyAoeWVzKSIsICJtYXRlcm5hbCBhbGNvaG9sIHVzZSAoeWVzKSIsICJtZWFuIGN2bSIsICJtZWRpYW4gY3ZtIikKc3VtbWFyeV9Db3JkX0lUVV93YV9maW5hbG56ZXJvVCA8LSBhcy5kYXRhLmZyYW1lKHQoc3VtbWFyeV9Db3JkX0lUVV93YV9maW5hbG56ZXJvWywtYygibm9uLXplcm8iLCAibWVkaWFuIGN2bSIsICJtZWFuIGN2bSIpXSkpCnN1bW1hcnlfQ29yZF9JVFVfd2FfZmluYWxuemVyb1QkdmFyaWFibGUgPC0gcm93bmFtZXMoc3VtbWFyeV9Db3JkX0lUVV93YV9maW5hbG56ZXJvVCkKcm93bmFtZXMoc3VtbWFyeV9Db3JkX0lUVV93YV9maW5hbG56ZXJvVCkgPC0gTlVMTApuYW1lcyhzdW1tYXJ5X0NvcmRfSVRVX3dhX2ZpbmFsbnplcm9UKVtuYW1lcyhzdW1tYXJ5X0NvcmRfSVRVX3dhX2ZpbmFsbnplcm9UKSA9PSAnVjEnXSA8LSAncGVyY2VudCcKc3VtbWFyeV9Db3JkX0lUVV93YV9maW5hbHplcm9UIDwtIHN1bW1hcnlfQ29yZF9JVFVfd2FfZmluYWxuemVyb1Rbb3JkZXIoc3VtbWFyeV9Db3JkX0lUVV93YV9maW5hbG56ZXJvVCRwZXJjZW50KSxdCgpzdW1tYXJ5X0NvcmRfSVRVX3dhX2ZpbmFsbnplcm9UJG51bWJlciA8LSBzZXEoMSwgbGVuZ3RoKHN1bW1hcnlfQ29yZF9JVFVfd2FfZmluYWxuemVyb1QkdmFyaWFibGUpKQpgYGAKCmBgYHtyLCBmaWcud2lkdGg9OH0KcGVyY192YXJzX0NvcmRfSVRVX3dhIDwtIAogIGdncGxvdChzdW1tYXJ5X0NvcmRfSVRVX3dhX2ZpbmFsbnplcm9ULCBhZXMocmVvcmRlcih2YXJpYWJsZSwgcGVyY2VudCksIHBlcmNlbnQsIGdyb3VwPTEpKSsKICBnZW9tX3BvaW50KCkrIGdlb21fbGluZSgpKwogIHlsYWIoIiUgb2NjdXJlbmNlIGluIG1vZGVscyB3aXRoIG56ZXJvIGNvZWZmaWNpZW50cyA9IDgiKSsKICBzY2FsZV95X2NvbnRpbnVvdXMoYnJlYWtzPWMoMC4xLDAuMiwwLjMsMC40LDAuNSwwLjYsMC43LDAuOCwwLjkpKSsKICB4bGFiKCJ2YXJpYWJsZSIpKwogIGNvb3JkX2ZsaXAoKSsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQ9MC43NSwgbGluZXR5cGU9ImRvdHRlZCIpKwogIHRoZW1lX2J3KCkKCnBlcmNfdmFyc19Db3JkX0lUVV93YQoKIyBkZWNpZGUgZm9yIGN1dC1vZmYgJSAtPiBoZXJlIC43NQoKRmlsdGVyKGZ1bmN0aW9uKHgpIGFueSh4ID4gMC43NSksIHN1bW1hcnlfQ29yZF9JVFVfd2FfZmluYWxuemVyb1ssIWMoIm5vbi16ZXJvIiwgIm1lYW4gY3ZtIiwgIm1lZGlhbiBjdm0iKV0pCgpgYGAKCmBgYHtyfQpwbmcoZmlsZW5hbWU9IlJlc3VsdHMvRmlndXJlcy9lbGFzdGljTmV0X3NpbmdsZVRpc3N1ZXMvT3V0Y29tZV9hZGQvYWxjb2hvbC92YXJzUGVyY2VudF9Db3JkLnBuZyIsIHdpZHRoPTExMDAsIGhlaWdodD0xNDAwLCByZXM9MzAwKQpwZXJjX3ZhcnNfQ29yZF9JVFVfd2EKZGV2Lm9mZigpCmBgYAoKICAKYGBge3J9CnBtMl9Db3JkX0lUVV93YV9jb2VmIDwtCiAgZGNhc3QocG0yX0NvcmRfSVRVX3dhWywKICAgICAgICAgICAgICAgICAgICAgICBhcy5saXN0KHVubGlzdCgKICAgICAgICAgICAgICAgICAgICAgICAgIGxhcHBseSguU0QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24oeCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeSA8LSB1bm5hbWUocXVhbnRpbGUoeFt4ICE9IDBdLCBwcm9icyA9IGMoMC4wMjUsIDAuOTc1KSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0KCJub25femVybyIgPSAxMDAgKiBtZWFuKHggIT0gMCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxjbCA9IHlbMV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVjbCA9IHlbMl0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoID0gZGlmZih5KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFuID0gbWVkaWFuKHhbeCE9IDBdKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSkpLAogICAgICAgICAgICAgICAgICAgICAgIC5TRGNvbHMgPSBjKCJDaGlsZF9TZXhmZW1hbGUiLCAiQ2hpbGRfQmlydGhfV2VpZ2h0IiwgIkNoaWxkX0JpcnRoX0xlbmd0aCIsICJDaGlsZF9IZWFkX0NpcmN1bWZlcmVuY2VfQXRfQmlydGgiLCAiRGVsaXZlcnlfbW9kZV9kaWNob3RvbWFpZGVkIiwgIkluZHVjZWRfTGFib3VyeWVzIiwgIlBhcml0eV9kaWNob3RvbWdpdmVuIGJpcnRoIGJlZm9yZSIsICJNYXRlcm5hbF9BZ2VfWWVhcnMiLCAiTWF0ZXJuYWxfQm9keV9NYXNzX0luZGV4X2luX0Vhcmx5X1ByZWduYW5jeSIsICJNYXRlcm5hbF9IeXBlcnRlbnNpb25fZGljaG90b21oeXBlcnRlbnNpb24gaW4gY3VycmVudCBwcmVnbmFuY3kiLCAiTWF0ZXJuYWxfRGlhYmV0ZXNfZGljaG90b21kaWFiZXRlcyBpbiBjdXJyZW50IHByZWduYW5jeSIsICJNYXRlcm5hbF9NZW50YWxfRGlzb3JkZXJzWWVzIiwgInNtb2tpbmdfZGljaG90b215ZXMiLCAibWF0ZXJuYWxfYWxjb2hvbF91c2V5ZXMiKSwKICAgICAgICAgICAgICAgICAgICAgICBieSA9IG56ZXJvXVtvcmRlcihuemVybyldICU+JQogICAgICAgICAgbWVsdChpZC52YXIgPSAibnplcm8iKSAlPiUKICAgICAgICAgIC5bLCBtZXRyaWMgOj0gc3ViKCJeLitcXC4oLispJCIsICJcXDEiLCB2YXJpYWJsZSldICU+JQogICAgICAgICAgLlssIHZhcmlhYmxlIDo9IHN1YigiXiguKylcXC4uKyQiLCAiXFwxIiwgdmFyaWFibGUpXSAlPiUKICAgICAgICAgIC5bbnplcm8gPT1uemVyb19maW5hbF9jb3JkX3dhXSwgbnplcm8rIHZhcmlhYmxlIH4gbWV0cmljLCB2YWx1ZS52YXI9InZhbHVlIikKCiMgZ2V0IGRlc2lyZWQgb3JkZXIgb2YgcHJlZGljdG9ycwpwbTJfQ29yZF9JVFVfd2FfY29lZiA8LQogIHBtMl9Db3JkX0lUVV93YV9jb2VmW21hdGNoKGMoIkNoaWxkX1NleGZlbWFsZSIsICJDaGlsZF9CaXJ0aF9XZWlnaHQiLCAiQ2hpbGRfQmlydGhfTGVuZ3RoIiwgIkNoaWxkX0hlYWRfQ2lyY3VtZmVyZW5jZV9BdF9CaXJ0aCIsICJEZWxpdmVyeV9tb2RlX2RpY2hvdG9tYWlkZWQiLCAiSW5kdWNlZF9MYWJvdXJ5ZXMiLCAiUGFyaXR5X2RpY2hvdG9tZ2l2ZW4gYmlydGggYmVmb3JlIiwgIk1hdGVybmFsX0FnZV9ZZWFycyIsICJNYXRlcm5hbF9Cb2R5X01hc3NfSW5kZXhfaW5fRWFybHlfUHJlZ25hbmN5IiwgIk1hdGVybmFsX0h5cGVydGVuc2lvbl9kaWNob3RvbWh5cGVydGVuc2lvbiBpbiBjdXJyZW50IHByZWduYW5jeSIsICJNYXRlcm5hbF9EaWFiZXRlc19kaWNob3RvbWRpYWJldGVzIGluIGN1cnJlbnQgcHJlZ25hbmN5IiwgIk1hdGVybmFsX01lbnRhbF9EaXNvcmRlcnNZZXMiLCAic21va2luZ19kaWNob3RvbXllcyIsICJtYXRlcm5hbF9hbGNvaG9sX3VzZXllcyIpLCBwbTJfQ29yZF9JVFVfd2FfY29lZiR2YXJpYWJsZSksXQpwbTJfQ29yZF9JVFVfd2FfY29lZiR2YXJpYWJsZSA8LSBmYWN0b3IocG0yX0NvcmRfSVRVX3dhX2NvZWYkdmFyaWFibCwgbGV2ZWxzPXVuaXF1ZShwbTJfQ29yZF9JVFVfd2FfY29lZiR2YXJpYWJsZSkpCgojIyBOT1RFOiBtZWRpYW4gaXMgdXNlZCBoZXJlIGluc3RlYWQgb2YgbWVhbgojIG1ha2UgZnJhbWUgZm9yIG9ubHkgc2lnbmlmaWNhbnQgdmFyaWFibGVzOgpwbTJfQ29yZF9JVFVfd2FfZGF0YWJsZSA8LSBkY2FzdChwbTJfQ29yZF9JVFVfd2FbLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzLmxpc3QodW5saXN0KAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwcGx5KC5TRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbih4KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5IDwtIHVubmFtZShxdWFudGlsZSh4W3ggIT0gMF0sIHByb2JzID0gYygwLjAyNSwgMC45NzUpKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3QoIm5vbl96ZXJvIiA9IDEwMCAqIG1lYW4oeCAhPSAwKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGNsID0geVsxXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWNsID0geVsyXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGggPSBkaWZmKHkpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYW4gPSBtZWRpYW4oeFt4IT0gMF0pKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLlNEY29scyA9IGMoIkNoaWxkX1NleGZlbWFsZSIsICJDaGlsZF9CaXJ0aF9XZWlnaHQiLCAiQ2hpbGRfQmlydGhfTGVuZ3RoIiwgIkNoaWxkX0hlYWRfQ2lyY3VtZmVyZW5jZV9BdF9CaXJ0aCIsICJEZWxpdmVyeV9tb2RlX2RpY2hvdG9tYWlkZWQiLCAiSW5kdWNlZF9MYWJvdXJ5ZXMiLCAiUGFyaXR5X2RpY2hvdG9tZ2l2ZW4gYmlydGggYmVmb3JlIiwgIk1hdGVybmFsX0FnZV9ZZWFycyIsICJNYXRlcm5hbF9Cb2R5X01hc3NfSW5kZXhfaW5fRWFybHlfUHJlZ25hbmN5IiwgIk1hdGVybmFsX0h5cGVydGVuc2lvbl9kaWNob3RvbWh5cGVydGVuc2lvbiBpbiBjdXJyZW50IHByZWduYW5jeSIsICJNYXRlcm5hbF9EaWFiZXRlc19kaWNob3RvbWRpYWJldGVzIGluIGN1cnJlbnQgcHJlZ25hbmN5IiwgIk1hdGVybmFsX01lbnRhbF9EaXNvcmRlcnNZZXMiLCAic21va2luZ19kaWNob3RvbXllcyIsICJtYXRlcm5hbF9hbGNvaG9sX3VzZXllcyIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5ID0gbnplcm9dW29yZGVyKG56ZXJvKV0gJT4lCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZWx0KGlkLnZhciA9ICJuemVybyIpICU+JQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLlssIG1ldHJpYyA6PSBzdWIoIl4uK1xcLiguKykkIiwgIlxcMSIsIHZhcmlhYmxlKV0gJT4lCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuWywgdmFyaWFibGUgOj0gc3ViKCJeKC4rKVxcLi4rJCIsICJcXDEiLCB2YXJpYWJsZSldICU+JQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBwcmludCAlPiUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5bbnplcm8gPT0gbnplcm9fZmluYWxfY29yZF93YSAmIHZhcmlhYmxlICVpbiUgc2lnX3Zhcl9uYW1lc19Db3JkX0lUVV93YV9maW5hbG56ZXJvXSwgbnplcm8rIHZhcmlhYmxlIH4gbWV0cmljLCB2YWx1ZS52YXI9InZhbHVlIikKCnBtMl9Db3JkX0lUVV93YV9kYXRhYmxlCgpgYGAKCmBgYHtyfQpzaWdfdmFyc19Db3JkX0lUVV93YSA8LQogIHBtMl9Db3JkX0lUVV93YV9jb2VmICU+JQogIGdncGxvdDI6OmdncGxvdCguKSArCiAgZ2dwbG90Mjo6dGhlbWVfYncoKSArCiAgZ2dwbG90Mjo6dGhlbWUoYXhpcy50ZXh0Lng9ZWxlbWVudF9ibGFuaygpKSsKICBnZ3Bsb3QyOjphZXMoeD0ibnplcm8iKSsKICBnZ3Bsb3QyOjpnZW9tX3BvaW50KG1hcHBpbmcgPSBnZ3Bsb3QyOjphZXMoeSA9IHZhcmlhYmxlLCBzaXplID1ub25femVybywgYWxwaGEgPSBub25femVybywgY29sb3IgPSBub25femVybykpICsKICBnZ3Bsb3QyOjpnZW9tX3RleHQoYWVzKHk9dmFyaWFibGUsIGxhYmVsPXNwcmludGYoIiUwLjJmIiwgcm91bmQobWVkaWFuLCBkaWdpdHM9MikpLCBzaXplPTUwKSxoanVzdD0wLCB2anVzdD0wLjUsIG51ZGdlX3ggPSAwLjEpKwogIGdncGxvdDI6OnNjYWxlX2NvbG9yX2dyYWRpZW50MihoaWdoID0gJ2dyZWVuJywgbWlkID0gInB1cnBsZSIsIGxvdyA9ICJibGFjayIsIG1pZHBvaW50ID01MCkrCiAgZ2dwbG90Mjo6c2NhbGVfYWxwaGEoZ3VpZGUgPSAnbm9uZScpKwogIGdncGxvdDI6OnNjYWxlX3NpemUoZ3VpZGUgPSAnbm9uZScpKwogIGdncGxvdDI6OnNjYWxlX3lfZGlzY3JldGUobGFiZWxzPSBjKCJjaGlsZCBzZXggKGZlbWFsZSkiLCAiYmlydGggd2VpZ2h0IiwgImJpcnRoIGxlbmd0aCIsICJoZWFkIGNpcmN1bWZlcmVuY2UiLCAiZGVsaXZlcnkgbW9kZSAoYWlkZWQpIiwgImluZHVjZWQgbGFib3IgKHllcykiLCAicGFyaXR5IChiaXJ0aCBiZWZvcmUpIiwgIm1hdGVybmFsIGFnZSIsICJtYXRlcm5hbCBCTUkiLCAibWF0ZXJuYWwgaHlwZXJ0ZW5zaW9uICh5ZXMpIiwgIm1hdGVybmFsIGRpYWJldGVzICh5ZXMpIiwgIm1hdGVybmFsIG1lbnRhbCBkaXNvcmRlcnMgKHllcykiLCAibWF0ZXJuYWwgc21va2luZyAoeWVzKSIsICJtYXRlcm5hbCBhbGNvaG9sIHVzZSAoeWVzKSIpKSsKICBnZ3Bsb3QyOjpsYWJzKHk9InByZWRpY3RvciIsIHggPSAibnVtYmVyIG9mIG5vbi16ZXJvIGNvZWZmaWNpZW50cyA9IDgiLCBjb2xvcj0iJSIpCgpgYGAKCmBgYHtyfQpjb2VmX0NvcmRfSVRVX3dhIDwtIAogIGdncGxvdChwbTJfQ29yZF9JVFVfd2FfY29lZiwgYWVzKHkgPSB2YXJpYWJsZSwgeD1tZWRpYW4pKSsKICBnZW9tX3BvaW50KG1hcHBpbmcgPSBnZ3Bsb3QyOjphZXMoeSA9IHZhcmlhYmxlLCBzaXplID1ub25femVybywgYWxwaGEgPSBub25femVybywgY29sb3IgPSBub25femVybykpKwogIHNjYWxlX2NvbG9yX2dyYWRpZW50MihoaWdoID0gJ2dyZWVuJywgbWlkID0gInB1cnBsZSIsIGxvdyA9ICJibGFjayIsIG1pZHBvaW50ID01MCwgbGltaXRzPWMoMCwxMDApKSsKICBzY2FsZV9hbHBoYShndWlkZSA9ICdub25lJykrCiAgc2NhbGVfc2l6ZShndWlkZSA9ICdub25lJykrCiAgZ2VvbV9wb2ludCgpKwogIGdlb21fZXJyb3JiYXIoYWVzKHkgPSB2YXJpYWJsZSwgeG1pbiA9IGxjbCwgeG1heCA9IHVjbCksIHdpZHRoID0gMC4yKSsKICBsYWJzKHk9InByZWRpY3RvciIsIHggPSAiXG5tZWRpYW4gJiA5NSUgQ0kgb2YgY29lZmZpY2llbnQgKG92ZXIgYm9vdHN0cmFwcykiLCBjb2xvcj0iJSIpKwogIHNjYWxlX3hfY29udGludW91cyhsaW1pdHM9YygtMC40LDAuNCksIGJyZWFrcz1jKC0uNCwtLjMsLS4yLCAtLjEsIDAsIC4xLCAuMiwgLjMsIC40KSkrCiAgc2NhbGVfeV9kaXNjcmV0ZShsYWJlbHM9IGMoImNoaWxkIHNleCAoZmVtYWxlKSIsICJiaXJ0aCB3ZWlnaHQiLCAiYmlydGggbGVuZ3RoIiwgImhlYWQgY2lyY3VtZmVyZW5jZSIsICJkZWxpdmVyeSBtb2RlIChhaWRlZCkiLCAiaW5kdWNlZCBsYWJvciAoeWVzKSIsICJwYXJpdHkgKGJpcnRoIGJlZm9yZSkiLCAibWF0ZXJuYWwgYWdlIiwgIm1hdGVybmFsIEJNSSIsICJtYXRlcm5hbCBoeXBlcnRlbnNpb24gKHllcykiLCAibWF0ZXJuYWwgZGlhYmV0ZXMgKHllcykiLCAibWF0ZXJuYWwgbWVudGFsIGRpc29yZGVycyAoeWVzKSIsICJtYXRlcm5hbCBzbW9raW5nICh5ZXMpIiwgIm1hdGVybmFsIGFsY29ob2wgdXNlICh5ZXMpIikpKwogIGdlb21fdmxpbmUoeGludGVyY2VwdD0wLCBsaW5ldHlwZT0iZGFzaGVkIikrCiAgdGhlbWVfYncoKSsKICB0aGVtZSh0ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNSksIGF4aXMudGl0bGUueD0gZWxlbWVudF90ZXh0KHNpemU9MTUpLCBheGlzLnRpdGxlLnk9IGVsZW1lbnRfdGV4dChzaXplPTE1KSkKCgpjb2VmX0NvcmRfSVRVX3dhIApgYGAKCgpgYGB7cn0KcG5nKGZpbGVuYW1lPSJSZXN1bHRzL0ZpZ3VyZXMvZWxhc3RpY05ldF9zaW5nbGVUaXNzdWVzL091dGNvbWVfYWRkL2FsY29ob2wvY29lZl9Db3JkLnBuZyIsIHdpZHRoPTI4MDAsIGhlaWdodD0xNDAwLCByZXM9NDAwKQpjb2VmX0NvcmRfSVRVX3dhIApkZXYub2ZmKCkKYGBgCgoKYGBge3J9CnAxIDwtCiAgY3N1bW1hcnlfQ29yZF9JVFVfd2EgJT4lCiAgbWVsdChpZC52YXJzID0gYygibnplcm8iLCAibWVhbl9jdm0iLCAibWVkaWFuX2N2bSIpKSAlPiUKICBnZ3Bsb3QyOjpnZ3Bsb3QoLikgKwogIGdncGxvdDI6OnRoZW1lX2J3KCkgKwogIGdncGxvdDI6OmFlcyh4ID0gbnplcm8pICsKICBnZ3Bsb3QyOjpnZW9tX3BvaW50KG1hcHBpbmcgPSBnZ3Bsb3QyOjphZXMoeSA9IHZhcmlhYmxlLCBzaXplID0gdmFsdWUsIGFscGhhID0gdmFsdWUsIGNvbG9yID0gdmFsdWUqMTAwKSkgKwogIGdncGxvdDI6OnNjYWxlX2NvbG9yX2dyYWRpZW50MihoaWdoID0gJ2dyZWVuJywgbWlkID0gInB1cnBsZSIsIGxvdyA9ICJibGFjayIsIG1pZHBvaW50ID01MCkrCiAgZ2dwbG90Mjo6c2NhbGVfYWxwaGEoZ3VpZGUgPSAnbm9uZScpKwogIGdncGxvdDI6OnNjYWxlX3NpemUoZ3VpZGUgPSAnbm9uZScpKwogIGdncGxvdDI6OnNjYWxlX3lfZGlzY3JldGUobGFiZWxzPSBjKCJjaGlsZCBzZXggKGZlbWFsZSkiLCAiYmlydGggd2VpZ2h0IiwgImJpcnRoIGxlbmd0aCIsICJoZWFkIGNpcmN1bWZlcmVuY2UiLCAiZGVsaXZlcnkgbW9kZSAoYWlkZWQpIiwgImluZHVjZWQgbGFib3IgKHllcykiLCAicGFyaXR5IChiaXJ0aCBiZWZvcmUpIiwgIm1hdGVybmFsIGFnZSIsICJtYXRlcm5hbCBCTUkiLCAibWF0ZXJuYWwgaHlwZXJ0ZW5zaW9uICh5ZXMpIiwgIm1hdGVybmFsIGRpYWJldGVzICh5ZXMpIiwgIm1hdGVybmFsIG1lbnRhbCBkaXNvcmRlcnMgKHllcykiLCAibWF0ZXJuYWwgc21va2luZyAoeWVzKSIsICJtYXRlcm5hbCBhbGNvaG9sIHVzZSAoeWVzKSIpKSsKICBnZ3Bsb3QyOjpzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzPTA6MTQsIGxhYmVscz0pKwogIGdncGxvdDI6OmxhYnMoeT0icHJlZGljdG9yIiwgeCA9ICJcbm51bWJlciBvZiBub24temVybyBjb2VmZmljaWVudHMiLCBjb2xvcj0iJSIpKwogIGdncGxvdDI6OnRoZW1lKHRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE3KSwgYXhpcy50aXRsZS54PSBlbGVtZW50X3RleHQoc2l6ZT0xNSksIGF4aXMudGl0bGUueT0gZWxlbWVudF90ZXh0KHNpemU9MTUpLCBsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpCiAgCnAyIDwtIAogIGdncGxvdChwbTJfQ29yZF9JVFVfd2FfY29lZiwgYWVzKHkgPSB2YXJpYWJsZSwgeD1tZWRpYW4pKSsKICBnZW9tX3BvaW50KG1hcHBpbmcgPSBnZ3Bsb3QyOjphZXMoeSA9IHZhcmlhYmxlLCBzaXplID1ub25femVybywgYWxwaGEgPSBub25femVybywgY29sb3IgPSBub25femVybykpKwogIHNjYWxlX2NvbG9yX2dyYWRpZW50MihoaWdoID0gJ2dyZWVuJywgbWlkID0gInB1cnBsZSIsIGxvdyA9ICJibGFjayIsIG1pZHBvaW50ID01MCwgbGltaXRzPWMoMCwxMDApKSsKICBzY2FsZV9hbHBoYShndWlkZSA9ICdub25lJykrCiAgc2NhbGVfc2l6ZShndWlkZSA9ICdub25lJykrCiAgZ2VvbV9wb2ludCgpKwogIGdlb21fZXJyb3JiYXIoYWVzKHkgPSB2YXJpYWJsZSwgeG1pbiA9IGxjbCwgeG1heCA9IHVjbCksIHdpZHRoID0gMC4yKSsKICBsYWJzKHk9IiIsIHggPSAiXG5tZWRpYW4gJiA5NSUgQ0kgb2YgY29lZmZpY2llbnQgKG92ZXIgYm9vdHN0cmFwcykiLCBjb2xvcj0iJSIpKwogIHNjYWxlX3hfY29udGludW91cyhsaW1pdHM9YygtMC40LDAuNCksIGJyZWFrcz1jKC0uNCwtLjMsLS4yLCAtLjEsIDAsIC4xLCAuMiwgLjMsIC40KSkrCiAgc2NhbGVfeV9kaXNjcmV0ZShsYWJlbHM9IGMoImNoaWxkIHNleCAoZmVtYWxlKSIsICJiaXJ0aCB3ZWlnaHQiLCAiYmlydGggbGVuZ3RoIiwgImhlYWQgY2lyY3VtZmVyZW5jZSIsICJkZWxpdmVyeSBtb2RlIChhaWRlZCkiLCAiaW5kdWNlZCBsYWJvciAoeWVzKSIsICJwYXJpdHkgKGJpcnRoIGJlZm9yZSkiLCAibWF0ZXJuYWwgYWdlIiwgIm1hdGVybmFsIEJNSSIsICJtYXRlcm5hbCBoeXBlcnRlbnNpb24gKHllcykiLCAibWF0ZXJuYWwgZGlhYmV0ZXMgKHllcykiLCAibWF0ZXJuYWwgbWVudGFsIGRpc29yZGVycyAoeWVzKSIsICJtYXRlcm5hbCBzbW9raW5nICh5ZXMpIiwgIm1hdGVybmFsIGFsY29ob2wgdXNlICh5ZXMpIikpKwogIGdlb21fdmxpbmUoeGludGVyY2VwdD0wLCBsaW5ldHlwZT0iZGFzaGVkIikrCiAgdGhlbWVfYncoKSsKICBnZ3RpdGxlKCJuemVybyA9IDciKSsKICB0aGVtZSh0ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNyksIGF4aXMudGl0bGUueD0gZWxlbWVudF90ZXh0KHNpemU9MTUpLCBheGlzLnRpdGxlLnk9IGVsZW1lbnRfdGV4dChzaXplPTE1KSwgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplPTE1KSwgYXhpcy50ZXh0Lnk9ZWxlbWVudF9ibGFuaygpKQoKZzEgPC0gZ2dwbG90R3JvYihwMSkKZzIgPC0gZ2dwbG90R3JvYihwMikKZyA8LSBjYmluZChnMSwgZzIsIHNpemUgPSAibGFzdCIpCmckaGVpZ2h0cyA8LSB1bml0LnBtYXgoZzEkaGVpZ2h0cywgZzIkaGVpZ2h0cykKCnBuZyhmaWxlbmFtZT0iUmVzdWx0cy9GaWd1cmVzL2VsYXN0aWNOZXRfc2luZ2xlVGlzc3Vlcy9PdXRjb21lX2FkZC9hbGNvaG9sL01vZGVsX2NvZWZfQ29yZC5wbmciLCB3aWR0aD01ODAwLCBoZWlnaHQ9MTYwMCwgcmVzPTQwMCkKZ3JpZC5kcmF3KGcpCmRldi5vZmYoKQpgYGAKCmdldCB0aGUgYmV0YSB2YWx1ZXMKCmBgYHtyfQojIyMgQ29kZSBmb3Igb25seSBpbmNsdWRpbmcgInNpZ25pZmljYW50IHZhcmlhYmxlcyIgaW4gdGhlIGJldGEgdmVjdG9yLCBiYXNlZCBvbiBWSVAgKD43NSUgbm90LXplcm8gaW4gYm9vdHN0cmFwcykKCiMgZ2V0IG1lZGlhbiBiZXRhIHZhbHVlcyBvZiB0aGUgMTAwMCBib290c3RyYXBzIGZvciB0aGUgbW9kZWwgd2l0aCA3IG5vbi16ZXJvIGNvZWZmaWNpZW50cwpCZXRhX2hhdF9zX2NvcmRfd2EgPC0gbWF0cml4KG1pc2NUb29sczo6Y29sTWVkaWFucyhwbTJfQ29yZF9JVFVfd2Fbbnplcm8gPT0gbnplcm9fZmluYWxfY29yZF93YSwgLlNELCAuU0Rjb2xzID0gYygiKEludGVyY2VwdCkiLHNpZ192YXJfbmFtZXNfQ29yZF9JVFVfd2FfZmluYWxuemVybyldKSwgbmNvbCA9IDEpCiMgaW50ZW5lcHQgYW5kIHZhcmlhYmxlIGJldGEgdmFsdWVzCiMgTk9URSB0aGF0IG1lZGlhbiBpcyB1c2VkIGhlcmUKcm93bmFtZXMoQmV0YV9oYXRfc19jb3JkX3dhKSA8LSBjKCJJbnRlcmNlcHQiLCBzaWdfdmFyX25hbWVzX0NvcmRfSVRVX3dhX2ZpbmFsbnplcm8pCgpCZXRhX0NvcmRfSVRVX3dhIDwtIEJldGFfaGF0X3NfY29yZF93YQpgYGAKCmBgYHtyfQpzYXZlKEJldGFfQ29yZF9JVFVfd2EsIGZpbGU9IklucHV0RGF0YS9EYXRhX0VsYXN0aWNOZXRzL0JldGFfQ29yZF9JVFVfd2EuUmRhdGEiKQpgYGAKClt0byB0aGUgdG9wXSgjdG9wKQoKCiMjIENWUyBlbGFzdGljIG5ldCB7I2VsYXN0aWNuZXRDVlNJVFV9ICAKbWFpbiBtb2RlbCwgd2l0aG91dCBhbGNvaG9sIHZhcmlhYmxlCgoKYGBge3J9CiMgaW4gY2FzZSB5b3Ugd2FudCB0byBzdGFydCBmcm9tIGhlcmUKbG9hZCgiSW5wdXREYXRhL0Nsb2NrQ2FsY3VsYXRpb25zSW5wdXQvUmVnX0lucHV0X0RhdGFfQ1ZTX0lUVV9FQUFSX25fbm9OYS5SZGF0YSIpCmBgYAoKCmBgYHtyfQp5cmNfbWF0X0lUVV9DVlNfbiA8LSBtYXRyaXgoUmVnX0lucHV0X0RhdGFfQ1ZTX0lUVV9FQUFSX25fbm9OYSRFQUFSX0xlZSkKeHJjX21hdF9JVFVfQ1ZTX24gPC0gbW9kZWwubWF0cml4KCB+IC4gLSBFQUFSX0xlZSwgZGF0YSA9IFJlZ19JbnB1dF9EYXRhX0NWU19JVFVfRUFBUl9uX25vTmEpWywgLTFdCnlyY19tYXRfSVRVX3NjYWxlZF9DVlNfbiA8LSBzY2FsZSh5cmNfbWF0X0lUVV9DVlNfbikKeHJjX21hdF9JVFVfc2NhbGVkX0NWU19uIDwtIHNjYWxlKHhyY19tYXRfSVRVX0NWU19uKQpgYGAKCgo8IS0tIHNldCBzZWVkIC0tPgoKPCEtLSBgYGB7cn0gLS0+CjwhLS0gc2V0LnNlZWQoMjAyMCkgLS0+CjwhLS0gYGBgIC0tPgoKCjwhLS0gYGBge3IsIHdhcm5pbmc9RkFMU0V9IC0tPgo8IS0tIG5ib290ID0gMTAwMCAtLT4KCjwhLS0gYm9vdHN0cmFwc19DVlNfSVRVX24gPC0gcmVwbGljYXRlKG5ib290LHsgLS0+CjwhLS0gICByd3MgPC0gc2FtcGxlKDE6bnJvdyh4cmNfbWF0X0lUVV9zY2FsZWRfQ1ZTX24pLCByZXBsYWNlID0gVFJVRSk7IC0tPgo8IS0tICAgZW5zcih4cmNfbWF0X0lUVV9zY2FsZWRfQ1ZTX25bcndzLCBdLCB5cmNfbWF0X0lUVV9zY2FsZWRfQ1ZTX25bcndzLCBdLCBzdGFuZGFyZGl6ZWQgPSBGQUxTRSwgZmFtaWx5PSJnYXVzc2lhbiIsIG5sYW1iZGE9MTAwLG5mb2xkcz0xMCxhbHBoYT1jKDAuMCwwLjEsMC4yLDAuMywwLjQsMC41LDAuNiwwLjcsMC44LDAuOSwxLjApKX0sIHNpbXBsaWZ5ID0gRkFMU0UpIC0tPgoKPCEtLSBgYGAgLS0+CgoKPCEtLSBgYGB7cn0gLS0+CjwhLS0gIyBzYXZlIGJvb3RzdHJhcCBvYmplY3QgLS0+CjwhLS0gc2F2ZShib290c3RyYXBzX0NWU19JVFVfbiwgZmlsZT0iSW5wdXREYXRhL0RhdGFfRWxhc3RpY05ldHMvYm9vdHN0cmFwc19DVlNfSVRVX25fMTAwMC5SZGF0YSIpIC0tPgo8IS0tIGBgYCAtLT4KCgpgYGB7cn0KbG9hZCgiSW5wdXREYXRhL0RhdGFfRWxhc3RpY05ldHMvYm9vdHN0cmFwc19DVlNfSVRVX25fMTAwMC5SZGF0YSIpCmBgYAoKCmBgYHtyfQpzdW1tYXJpZXNfQ1ZTX0lUVV9uIDwtCiAgYm9vdHN0cmFwc19DVlNfSVRVX24gJT4lCiAgbGFwcGx5KHN1bW1hcnkpICU+JQogIHJiaW5kbGlzdChpZGNvbCA9ICJib290c3RyYXAiKQoKc3VtbWFyaWVzX0NWU19JVFVfbgpgYGAKCgpgYGB7cn0Kc3VtbWFyaWVzX0NWU19JVFVfblssIC5TRFtjdm0gPT0gbWluKGN2bSldLCBieSA9IGMoImJvb3RzdHJhcCIsICJuemVybyIpXSAlPiUKICBnZ3Bsb3QyOjpnZ3Bsb3QoZGF0YSA9IC4pICsKICBnZ3Bsb3QyOjphZXMoeCA9IG56ZXJvLCB5ID0gY3ZtLCBncm91cCA9IGJvb3RzdHJhcCkgKwogIGdncGxvdDI6Omdlb21fcG9pbnQoKSArCiAgZ2dwbG90Mjo6Z2VvbV9saW5lKCkKYGBgCgoKYGBge3J9CnBuZyhmaWxlbmFtZT0iUmVzdWx0cy9GaWd1cmVzL2VsYXN0aWNOZXRfc2luZ2xlVGlzc3Vlcy9PdXRjb21lX21haW4vYm9vdHN0cmFwc19DVlMucG5nIiwgd2lkdGg9ODAwLCBoZWlnaHQ9NjAwKQpzdW1tYXJpZXNfQ1ZTX0lUVV9uWywgLlNEW2N2bSA9PSBtaW4oY3ZtKV0sIGJ5ID0gYygiYm9vdHN0cmFwIiwgIm56ZXJvIildICU+JQogIGdncGxvdDI6OmdncGxvdChkYXRhID0gLikgKwogIGdncGxvdDI6OmFlcyh4ID0gbnplcm8sIHkgPSBjdm0sIGdyb3VwID0gYm9vdHN0cmFwKSArCiAgZ2dwbG90Mjo6Z2VvbV9wb2ludCgpICsKICBnZ3Bsb3QyOjpnZW9tX2xpbmUoKQpkZXYub2ZmKCkKYGBgCgoKPCEtLSBgYGB7ciwgd2FybmluZz1GQUxTRX0gLS0+CjwhLS0gIyBsb3dlc3QgY3ZtIGJ5IGJvb3RzdHJhcCBhbmQgbnplcm8gLS0+CjwhLS0gcG1fQ1ZTX0lUVV9uIDwtIHN1bW1hcmllc19DVlNfSVRVX25bLCAuU0RbY3ZtID09IG1pbihjdm0pXSwgYnkgPSBjKCJib290c3RyYXAiLCAibnplcm8iKV0gLS0+CjwhLS0gcG0yX0NWU19JVFVfbiA8LSBOVUxMIC0tPgoKPCEtLSBmb3IoaSBpbiBhcy5pbnRlZ2VyKHNlcSgxLCBucm93KHBtX0NWU19JVFVfbiksIGJ5ID0gMSkpKSB7IC0tPgo8IS0tICAgcG0yX0NWU19JVFVfbiA8LSByYmluZChwbTJfQ1ZTX0lUVV9uLCAtLT4KPCEtLSAgICAgICAgICAgICAgICBjYmluZChwbV9DVlNfSVRVX25baSwgXSwgLS0+CjwhLS0gICAgICAgICAgICAgICAgdChhcy5tYXRyaXgoY29lZihib290c3RyYXBzX0NWU19JVFVfbltbcG1fQ1ZTX0lUVV9uW2ksIGJvb3RzdHJhcF1dXVtbcG1fQ1ZTX0lUVV9uW2ksIGxfaW5kZXhdXV0sIHMgPSBwbV9DVlNfSVRVX25baSwgbGFtYmRhXSkpKSAtLT4KPCEtLSAgICAgICAgICAgICAgICApIC0tPgo8IS0tICAgKSAtLT4KPCEtLSB9IC0tPgoKPCEtLSBwbTJfQ1ZTX0lUVV9uIC0tPgo8IS0tIGBgYCAtLT4KCgo8IS0tIGBgYHtyfSAtLT4KPCEtLSAjIHNhdmUgInByZWZlcmFibGUgbW9kZWxzIiAtLT4KPCEtLSBzYXZlKHBtMl9DVlNfSVRVX24sIGZpbGU9IklucHV0RGF0YS9EYXRhX0VsYXN0aWNOZXRzL3BtMl9DVlNfSVRVX24uUmRhdGEiKSAtLT4KPCEtLSBgYGAgLS0+CgoKCmBgYHtyfQpsb2FkKCJJbnB1dERhdGEvRGF0YV9FbGFzdGljTmV0cy9wbTJfQ1ZTX0lUVV9uLlJkYXRhIikKYGBgCgoKYGBge3J9CmNzdW1tYXJ5X0NWU19JVFVfbiA8LSBSZWR1Y2UoZnVuY3Rpb24oeCx5KSBtZXJnZSh4ID0geCwgeSA9IHksIGJ5ID0gIm56ZXJvIiksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0KHBtMl9DVlNfSVRVX25bLCBsYXBwbHkoLlNELCBmdW5jdGlvbih4KSB7bWVhbih4ICE9IDApfSksIC5TRGNvbHMgPSBjKCJHZXN0YXRpb25hbF9BZ2VfV2Vla3MiLCAiQ2hpbGRfU2V4ZmVtYWxlIiwgIkNoaWxkX0JpcnRoX1dlaWdodCIsICJDaGlsZF9CaXJ0aF9MZW5ndGgiLCAiQ2hpbGRfSGVhZF9DaXJjdW1mZXJlbmNlX0F0X0JpcnRoIiwgIkRlbGl2ZXJ5X21vZGVfZGljaG90b21haWRlZCIsICJJbmR1Y2VkX0xhYm91cnllcyIsICJQYXJpdHlfZGljaG90b21naXZlbiBiaXJ0aCBiZWZvcmUiLCAiTWF0ZXJuYWxfQWdlX1llYXJzIiwgIk1hdGVybmFsX0JvZHlfTWFzc19JbmRleF9pbl9FYXJseV9QcmVnbmFuY3kiLCAiTWF0ZXJuYWxfSHlwZXJ0ZW5zaW9uX2RpY2hvdG9taHlwZXJ0ZW5zaW9uIGluIGN1cnJlbnQgcHJlZ25hbmN5IiwgIk1hdGVybmFsX0RpYWJldGVzX2RpY2hvdG9tZGlhYmV0ZXMgaW4gY3VycmVudCBwcmVnbmFuY3kiLCAiTWF0ZXJuYWxfTWVudGFsX0Rpc29yZGVyc1llcyIsICJzbW9raW5nX2RpY2hvdG9teWVzIiksIGJ5ID0gbnplcm9dCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBtMl9DVlNfSVRVX25bLCAuKG1lYW5fY3ZtID0gbWVhbihjdm0pKSwgYnkgPSBuemVyb10sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG0yX0NWU19JVFVfblssIC4obWVkaWFuX2N2bSA9IG1lZGlhbihjdm0pKSwgYnkgPSBuemVyb10KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSlbb3JkZXIobnplcm8pXQoKY3N1bW1hcnlfQ1ZTX0lUVV9uCmBgYAoKCmBgYHtyLCBmaWcud2lkdGg9OCwgZmlnLmhlaWd0aD04fQpnMV9DVlNfSVRVX24gPC0KICBjc3VtbWFyeV9DVlNfSVRVX24gJT4lCiAgbWVsdChpZC52YXJzID0gYygibnplcm8iLCAibWVhbl9jdm0iLCAibWVkaWFuX2N2bSIpKSAlPiUKICBnZ3Bsb3QyOjpnZ3Bsb3QoLikgKwogIGdncGxvdDI6OnRoZW1lX2J3KCkgKwogIGdncGxvdDI6OmFlcyh4ID0gbnplcm8pICsKICBnZ3Bsb3QyOjpnZW9tX3BvaW50KG1hcHBpbmcgPSBnZ3Bsb3QyOjphZXMoeSA9IHZhcmlhYmxlLCBzaXplID0gdmFsdWUsIGFscGhhID0gdmFsdWUsIGNvbG9yID0gdmFsdWUqMTAwKSkgKwogIGdncGxvdDI6OnNjYWxlX2NvbG9yX2dyYWRpZW50MihoaWdoID0gJ2dyZWVuJywgbWlkID0gInB1cnBsZSIsIGxvdyA9ICJibGFjayIsIG1pZHBvaW50ID01MCkrCiAgZ2dwbG90Mjo6c2NhbGVfYWxwaGEoZ3VpZGUgPSAnbm9uZScpKwogIGdncGxvdDI6OnNjYWxlX3NpemUoZ3VpZGUgPSAnbm9uZScpKwogIGdncGxvdDI6OnNjYWxlX3lfZGlzY3JldGUobGFiZWxzPSBjKCJnZXN0YWdlIGF0IGJpcnRoIiwgImNoaWxkIHNleCAoZmVtYWxlKSIsICJiaXJ0aCB3ZWlnaHQiLCAiYmlydGggbGVuZ3RoIiwgImhlYWQgY2lyY3VtZmVyZW5jZSIsICJkZWxpdmVyeSBtb2RlIChhaWRlZCkiLCAiaW5kdWNlZCBsYWJvciAoeWVzKSIsICJwYXJpdHkgKGJpcnRoIGJlZm9yZSkiLCAibWF0ZXJuYWwgYWdlIiwgIm1hdGVybmFsIEJNSSIsICJtYXRlcm5hbCBoeXBlcnRlbnNpb24gKHllcykiLCAibWF0ZXJuYWwgZGlhYmV0ZXMgKHllcykiLCAibWF0ZXJuYWwgbWVudGFsIGRpc29yZGVycyAoeWVzKSIsICJtYXRlcm5hbCBzbW9raW5nICh5ZXMpIikpKwogIGdncGxvdDI6OnNjYWxlX3hfY29udGludW91cyhicmVha3M9MDoxNCwgbGFiZWxzPSkrCiAgZ2dwbG90Mjo6bGFicyh5PSJwcmVkaWN0b3IiLCB4ID0gIm51bWJlciBvZiBub24temVybyBjb2VmZmljaWVudHMiLCBjb2xvcj0iJSIpKwogIGdncGxvdDI6OnRoZW1lKHRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE1KSwgYXhpcy50aXRsZS54PSBlbGVtZW50X3RleHQoc2l6ZT0xNSksIGF4aXMudGl0bGUueT0gZWxlbWVudF90ZXh0KHNpemU9MTUpKQoKZzJfQ1ZTX0lUVV9uIDwtCiAgY3N1bW1hcnlfQ1ZTX0lUVV9uICU+JQogIGdncGxvdDI6OmdncGxvdCguKSArCiAgZ2dwbG90Mjo6dGhlbWVfYncoKSArCiAgZ2dwbG90Mjo6YWVzKHggPSBuemVybywgeSA9IG1lZGlhbl9jdm0pICsKICBnZ3Bsb3QyOjpnZW9tX3BvaW50KCkgKyBnZ3Bsb3QyOjpnZW9tX2xpbmUoKSsKICBnZ3Bsb3QyOjpsYWJzKHk9Im1lZGlhbiBjdm0iLCB4ID0gIm51bWJlciBvZiBub24temVybyBjb2VmZmljaWVudHMiKSsKICBnZ3Bsb3QyOjpzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzPTA6MTQsIGxhYmVscz0pKwogIGdncGxvdDI6OnRoZW1lKGF4aXMudGV4dD1lbGVtZW50X3RleHQoc2l6ZT0xNSksYXhpcy50aXRsZT1lbGVtZW50X3RleHQoc2l6ZT0xOCkpCgoKZ3JpZEV4dHJhOjpncmlkLmFycmFuZ2UoZzFfQ1ZTX0lUVV9uLCBnMl9DVlNfSVRVX24sIG5jb2wgPSAxKQoKIyBub3RlOiBub3QgYSBiaWcgZGlmZmVyZW5jZSBpZiBtZWFuL21lZGlhbiBjdm0gaXMgdXNlZApgYGAKCmBgYHtyfQpwbmcoZmlsZW5hbWU9IlJlc3VsdHMvRmlndXJlcy9lbGFzdGljTmV0X3NpbmdsZVRpc3N1ZXMvT3V0Y29tZV9tYWluL2Jvb3RzdHJhcE1vZGVsc19DVlMucG5nIiwgd2lkdGg9MjQwMCwgaGVpZ2h0PTE4MDAsIHJlcz0zMDApCmdyaWRFeHRyYTo6Z3JpZC5hcnJhbmdlKGcxX0NWU19JVFVfbiwgZzJfQ1ZTX0lUVV9uLCBuY29sID0gMSkKZGV2Lm9mZigpCmBgYApgYGB7cn0KcG5nKGZpbGVuYW1lPSJSZXN1bHRzL0ZpZ3VyZXMvZWxhc3RpY05ldF9zaW5nbGVUaXNzdWVzL091dGNvbWVfbWFpbi9Nb2RlbF9DVlMucG5nIiwgd2lkdGg9MjgwMCwgaGVpZ2h0PTE0MDAsIHJlcz00MDApCmcxX0NWU19JVFVfbgpkZXYub2ZmKCkKYGBgCgoKYGBge3J9CmVsYm93X2ZpbmRlcihjc3VtbWFyeV9DVlNfSVRVX24kbnplcm9bLTFdLCBjc3VtbWFyeV9DVlNfSVRVX24kbWVkaWFuX2N2bVstMV0pCm56ZXJvX2luZGljZXNfQ1ZTIDwtIGRhdGEuZnJhbWUodChlbGJvd19maW5kZXIoY3N1bW1hcnlfQ1ZTX0lUVV9uJG56ZXJvWy0xXSwgY3N1bW1hcnlfQ1ZTX0lUVV9uJG1lZGlhbl9jdm1bLTFdKSkpCmNvbG5hbWVzKG56ZXJvX2luZGljZXNfQ1ZTKSA8LSBjKCJ4IiwgInkiKQpyb3duYW1lcyhuemVyb19pbmRpY2VzX0NWUykgPC0gTlVMTApgYGAKYGBge3J9Cm56ZXJvX2ZpbmFsX0NWUyA8LSA4CmBgYAoKYGBge3J9Cm5vbnplcm9fY2hvb3NlX0NWUyA8LSBnZ3Bsb3QyOjpnZ3Bsb3QoY3N1bW1hcnlfQ1ZTX0lUVV9uKSArCiAgZ2dwbG90Mjo6dGhlbWVfYncoKSsKICBnZ3Bsb3QyOjphZXMoeCA9IG56ZXJvLCB5ID0gbWVkaWFuX2N2bSkgKwogIGdncGxvdDI6OnNjYWxlX3hfY29udGludW91cyhicmVha3M9YygwOjE3KSkrCiAgZ2dwbG90Mjo6Z2VvbV9wb2ludCgpICsgZ2dwbG90Mjo6Z2VvbV9saW5lKCkrCiAgZ2dwbG90Mjo6Z2VvbV9wb2ludChkYXRhPW56ZXJvX2luZGljZXNfQ1ZTLCBhZXMoeD14LCB5PXkpLCBjb2xvdXI9InJlZCIsIHNpemU9MikrCiAgZ2dwbG90Mjo6eWxhYigibWVkaWFuIG9mIG1pbmltdW0gY3Jvc3MtdmFsaWRhdGlvbiBlcnJvcnMgb3ZlciBib290c3RyYXBzIikrCiAgZ2dwbG90Mjo6eGxhYigibnVtYmVyIG9mIG5vbi16ZXJvIGNvZWZmaWNpZW50cyIpKwogIGdncGxvdDI6Omdlb21fc2VnbWVudChhZXMoeCA9IG56ZXJvWzFdLCB5ID0gbWVkaWFuX2N2bVsxXSwgeGVuZCA9IG56ZXJvWzE1XSwgeWVuZCA9IG1lZGlhbl9jdm1bMTVdLCBjb2xvdXIgPSAic2VnbWVudCIpLCBkYXRhID0gY3N1bW1hcnlfQ1ZTX0lUVV9uLCBzaG93LmxlZ2VuZCA9IEYpCgpub256ZXJvX2Nob29zZV9DVlMKYGBgCgpgYGB7cn0KcG5nKGZpbGVuYW1lPSJSZXN1bHRzL0ZpZ3VyZXMvZWxhc3RpY05ldF9zaW5nbGVUaXNzdWVzL091dGNvbWVfbWFpbi9uemVyb19jaG9vc2VfQ1ZTLnBuZyIsIHdpZHRoPTE2MDAsIGhlaWdodD0xNDAwLCByZXM9MzAwKQpub256ZXJvX2Nob29zZV9DVlMKZGV2Lm9mZigpCmBgYAoKYGBge3J9CnN1bW1hcnlfQ1ZTX0lUVV9uX2ZpbmFsbnplcm8gPC0gY3N1bW1hcnlfQ1ZTX0lUVV9uW256ZXJvICVpbiUgbnplcm9fZmluYWxfQ1ZTXQpzaWdfdmFyX25hbWVzX0NWU19JVFVfbl9maW5hbG56ZXJvIDwtIEZpbHRlcihmdW5jdGlvbih4KSBhbnkoeCA+IDAuNzUpLCBzdW1tYXJ5X0NWU19JVFVfbl9maW5hbG56ZXJvWywhYygibnplcm8iLCAibWVhbl9jdm0iLCAibWVkaWFuX2N2bSIpXSkgJT4lIGNvbG5hbWVzKCkKY29sbmFtZXMoc3VtbWFyeV9DVlNfSVRVX25fZmluYWxuemVybykgPC0gYygibm9uLXplcm8iLCAiZ2VzdGFnZSBhdCBiaXJ0aCIsICJjaGlsZCBzZXggKGZlbWFsZSkiLCAiYmlydGggd2VpZ2h0IiwgImJpcnRoIGxlbmd0aCIsICJoZWFkIGNpcmN1bWZlcmVuY2UiLCAiZGVsaXZlcnkgbW9kZSAoYWlkZWQpIiwgImluZHVjZWQgbGFib3IgKHllcykiLCAicGFyaXR5IChiaXJ0aCBiZWZvcmUpIiwgIm1hdGVybmFsIGFnZSIsICJtYXRlcm5hbCBCTUkiLCAibWF0ZXJuYWwgaHlwZXJ0ZW5zaW9uICh5ZXMpIiwgIm1hdGVybmFsIGRpYWJldGVzICh5ZXMpIiwgIm1hdGVybmFsIG1lbnRhbCBkaXNvcmRlcnMgKHllcykiLCAibWF0ZXJuYWwgc21va2luZyAoeWVzKSIsICJtZWFuIGN2bSIsICJtZWRpYW4gY3ZtIikKc3VtbWFyeV9DVlNfSVRVX25fZmluYWxuemVyb1QgPC0gYXMuZGF0YS5mcmFtZSh0KHN1bW1hcnlfQ1ZTX0lUVV9uX2ZpbmFsbnplcm9bLC1jKCJub24temVybyIsICJtZWRpYW4gY3ZtIiwgIm1lYW4gY3ZtIildKSkKc3VtbWFyeV9DVlNfSVRVX25fZmluYWxuemVyb1QkdmFyaWFibGUgPC0gcm93bmFtZXMoc3VtbWFyeV9DVlNfSVRVX25fZmluYWxuemVyb1QpCnJvd25hbWVzKHN1bW1hcnlfQ1ZTX0lUVV9uX2ZpbmFsbnplcm9UKSA8LSBOVUxMCm5hbWVzKHN1bW1hcnlfQ1ZTX0lUVV9uX2ZpbmFsbnplcm9UKVtuYW1lcyhzdW1tYXJ5X0NWU19JVFVfbl9maW5hbG56ZXJvVCkgPT0gJ1YxJ10gPC0gJ3BlcmNlbnQnCnN1bW1hcnlfQ1ZTX0lUVV9uX2ZpbmFsbnplcm9UIDwtIHN1bW1hcnlfQ1ZTX0lUVV9uX2ZpbmFsbnplcm9UW29yZGVyKHN1bW1hcnlfQ1ZTX0lUVV9uX2ZpbmFsbnplcm9UJHBlcmNlbnQpLF0KCnN1bW1hcnlfQ1ZTX0lUVV9uX2ZpbmFsbnplcm9UJG51bWJlciA8LSBzZXEoMSwgbGVuZ3RoKHN1bW1hcnlfQ1ZTX0lUVV9uX2ZpbmFsbnplcm9UJHZhcmlhYmxlKSkKYGBgCgoKYGBge3IsIGZpZy53aWR0aD04fQpwZXJjX3ZhcnNfQ1ZTX0lUVV9uIDwtIApnZ3Bsb3Qoc3VtbWFyeV9DVlNfSVRVX25fZmluYWxuemVyb1QsIGFlcyhyZW9yZGVyKHZhcmlhYmxlLCBwZXJjZW50KSwgcGVyY2VudCwgZ3JvdXA9MSkpKwpnZW9tX3BvaW50KCkrIGdlb21fbGluZSgpKwp5bGFiKCIlIG9jY3VyZW5jZSBpbiBtb2RlbHMgd2l0aCBuemVybyBjb2VmZmljaWVudHMgPSA5IikrCnNjYWxlX3lfY29udGludW91cyhicmVha3M9YygwLjEsMC4yLDAuMywwLjQsMC41LDAuNiwwLjcsMC44LDAuOSkpKwp4bGFiKCJ2YXJpYWJsZSIpKwpjb29yZF9mbGlwKCkrCmdlb21faGxpbmUoeWludGVyY2VwdD0wLjc1LCBsaW5ldHlwZT0iZG90dGVkIikrCnRoZW1lX2J3KCkKCnBlcmNfdmFyc19DVlNfSVRVX24KCiMgZGVjaWRlIGZvciBjdXQtb2ZmICUgLT4gaGVyZSAuNzUKCkZpbHRlcihmdW5jdGlvbih4KSBhbnkoeCA+IDAuNzUpLCBzdW1tYXJ5X0NWU19JVFVfbl9maW5hbG56ZXJvWywhYygibm9uLXplcm8iLCAibWVhbiBjdm0iLCAibWVkaWFuIGN2bSIpXSkKCmBgYAoKYGBge3J9CnBuZyhmaWxlbmFtZT0iUmVzdWx0cy9GaWd1cmVzL2VsYXN0aWNOZXRfc2luZ2xlVGlzc3Vlcy9PdXRjb21lX21haW4vdmFyc1BlcmNlbnRfQ1ZTLnBuZyIsIHdpZHRoPTE4MDAsIGhlaWdodD0xNDAwLCByZXM9MzAwKQpwZXJjX3ZhcnNfQ1ZTX0lUVV9uCmRldi5vZmYoKQpgYGAKCgpgYGB7cn0KcG0yX0NWU19JVFVfbl9jb2VmIDwtCmRjYXN0KHBtMl9DVlNfSVRVX25bLAphcy5saXN0KHVubGlzdCgKbGFwcGx5KC5TRCwKZnVuY3Rpb24oeCkgewp5IDwtIHVubmFtZShxdWFudGlsZSh4W3ggIT0gMF0sIHByb2JzID0gYygwLjAyNSwgMC45NzUpKSkKbGlzdCgibm9uX3plcm8iID0gMTAwICogbWVhbih4ICE9IDApLApsY2wgPSB5WzFdLAp1Y2wgPSB5WzJdLAp3aWR0aCA9IGRpZmYoeSksCm1lZGlhbiA9IG1lZGlhbih4W3ghPSAwXSkpCn0pKSksCi5TRGNvbHMgPSBjKCJHZXN0YXRpb25hbF9BZ2VfV2Vla3MiLCAiQ2hpbGRfU2V4ZmVtYWxlIiwgIkNoaWxkX0JpcnRoX1dlaWdodCIsICJDaGlsZF9CaXJ0aF9MZW5ndGgiLCAiQ2hpbGRfSGVhZF9DaXJjdW1mZXJlbmNlX0F0X0JpcnRoIiwgIkRlbGl2ZXJ5X21vZGVfZGljaG90b21haWRlZCIsICJJbmR1Y2VkX0xhYm91cnllcyIsICJQYXJpdHlfZGljaG90b21naXZlbiBiaXJ0aCBiZWZvcmUiLCAiTWF0ZXJuYWxfQWdlX1llYXJzIiwgIk1hdGVybmFsX0JvZHlfTWFzc19JbmRleF9pbl9FYXJseV9QcmVnbmFuY3kiLCAiTWF0ZXJuYWxfSHlwZXJ0ZW5zaW9uX2RpY2hvdG9taHlwZXJ0ZW5zaW9uIGluIGN1cnJlbnQgcHJlZ25hbmN5IiwgIk1hdGVybmFsX0RpYWJldGVzX2RpY2hvdG9tZGlhYmV0ZXMgaW4gY3VycmVudCBwcmVnbmFuY3kiLCAiTWF0ZXJuYWxfTWVudGFsX0Rpc29yZGVyc1llcyIsICJzbW9raW5nX2RpY2hvdG9teWVzIiksCmJ5ID0gbnplcm9dW29yZGVyKG56ZXJvKV0gJT4lCm1lbHQoaWQudmFyID0gIm56ZXJvIikgJT4lCi5bLCBtZXRyaWMgOj0gc3ViKCJeLitcXC4oLispJCIsICJcXDEiLCB2YXJpYWJsZSldICU+JQouWywgdmFyaWFibGUgOj0gc3ViKCJeKC4rKVxcLi4rJCIsICJcXDEiLCB2YXJpYWJsZSldICU+JQouW256ZXJvID09bnplcm9fZmluYWxfQ1ZTXSwgbnplcm8rIHZhcmlhYmxlIH4gbWV0cmljLCB2YWx1ZS52YXI9InZhbHVlIikKCiMgZ2V0IGRlc2lyZWQgb3JkZXIgb2YgcHJlZGljdG9ycwpwbTJfQ1ZTX0lUVV9uX2NvZWYgPC0KcG0yX0NWU19JVFVfbl9jb2VmW21hdGNoKGMoIkdlc3RhdGlvbmFsX0FnZV9XZWVrcyIsICJDaGlsZF9TZXhmZW1hbGUiLCAiQ2hpbGRfQmlydGhfV2VpZ2h0IiwgIkNoaWxkX0JpcnRoX0xlbmd0aCIsICJDaGlsZF9IZWFkX0NpcmN1bWZlcmVuY2VfQXRfQmlydGgiLCAiRGVsaXZlcnlfbW9kZV9kaWNob3RvbWFpZGVkIiwgIkluZHVjZWRfTGFib3VyeWVzIiwgIlBhcml0eV9kaWNob3RvbWdpdmVuIGJpcnRoIGJlZm9yZSIsICJNYXRlcm5hbF9BZ2VfWWVhcnMiLCAiTWF0ZXJuYWxfQm9keV9NYXNzX0luZGV4X2luX0Vhcmx5X1ByZWduYW5jeSIsICJNYXRlcm5hbF9IeXBlcnRlbnNpb25fZGljaG90b21oeXBlcnRlbnNpb24gaW4gY3VycmVudCBwcmVnbmFuY3kiLCAiTWF0ZXJuYWxfRGlhYmV0ZXNfZGljaG90b21kaWFiZXRlcyBpbiBjdXJyZW50IHByZWduYW5jeSIsICJNYXRlcm5hbF9NZW50YWxfRGlzb3JkZXJzWWVzIiwgInNtb2tpbmdfZGljaG90b215ZXMiKSwgcG0yX0NWU19JVFVfbl9jb2VmJHZhcmlhYmxlKSxdCnBtMl9DVlNfSVRVX25fY29lZiR2YXJpYWJsZSA8LSBmYWN0b3IocG0yX0NWU19JVFVfbl9jb2VmJHZhcmlhYmwsIGxldmVscz11bmlxdWUocG0yX0NWU19JVFVfbl9jb2VmJHZhcmlhYmxlKSkKCmBgYAoKYGBge3J9CndyaXRlX3hsc3gocG0yX0NWU19JVFVfbl9jb2VmLCJSZXN1bHRzL1RhYmxlcy9Db2VmZmljaWVudHNNb2RlbF9DVlMueGxzeCIpCmBgYAoKYGBge3J9CnNpZ192YXJzX0NWU19JVFVfbiA8LQpwbTJfQ1ZTX0lUVV9uX2NvZWYgJT4lCiAgZ2dwbG90Mjo6Z2dwbG90KC4pICsKICBnZ3Bsb3QyOjp0aGVtZV9idygpICsKICBnZ3Bsb3QyOjp0aGVtZShheGlzLnRleHQueD1lbGVtZW50X2JsYW5rKCkpKwogIGdncGxvdDI6OmFlcyh4PSJuemVybyIpKwogIGdncGxvdDI6Omdlb21fcG9pbnQobWFwcGluZyA9IGdncGxvdDI6OmFlcyh5ID0gdmFyaWFibGUsIHNpemUgPW5vbl96ZXJvLCBhbHBoYSA9IG5vbl96ZXJvLCBjb2xvciA9IG5vbl96ZXJvKSkgKwogIGdncGxvdDI6Omdlb21fdGV4dChhZXMoeT12YXJpYWJsZSwgbGFiZWw9c3ByaW50ZigiJTAuMmYiLCByb3VuZChtZWRpYW4sIGRpZ2l0cz0yKSksIHNpemU9NTApLGhqdXN0PTAsIHZqdXN0PTAuNSwgbnVkZ2VfeCA9IDAuMSkrCiAgZ2dwbG90Mjo6c2NhbGVfY29sb3JfZ3JhZGllbnQyKGhpZ2ggPSAnZ3JlZW4nLCBtaWQgPSAicHVycGxlIiwgbG93ID0gImJsYWNrIiwgbWlkcG9pbnQgPTUwKSsKICBnZ3Bsb3QyOjpzY2FsZV9hbHBoYShndWlkZSA9ICdub25lJykrCiAgZ2dwbG90Mjo6c2NhbGVfc2l6ZShndWlkZSA9ICdub25lJykrCiAgZ2dwbG90Mjo6c2NhbGVfeV9kaXNjcmV0ZShsYWJlbHM9IGMoImdlc3RhZ2UgYXQgYmlydGgiLCAiY2hpbGQgc2V4IChmZW1hbGUpIiwgImJpcnRoIHdlaWdodCIsICJiaXJ0aCBsZW5ndGgiLCAiaGVhZCBjaXJjdW1mZXJlbmNlIiwgImRlbGl2ZXJ5IG1vZGUgKGFpZGVkKSIsICJpbmR1Y2VkIGxhYm9yICh5ZXMpIiwgInBhcml0eSAoYmlydGggYmVmb3JlKSIsICJtYXRlcm5hbCBhZ2UiLCAibWF0ZXJuYWwgQk1JIiwgIm1hdGVybmFsIGh5cGVydGVuc2lvbiAoeWVzKSIsICJtYXRlcm5hbCBkaWFiZXRlcyAoeWVzKSIsICJtYXRlcm5hbCBtZW50YWwgZGlzb3JkZXJzICh5ZXMpIiwgIm1hdGVybmFsIHNtb2tpbmcgKHllcykiKSkrCiAgZ2dwbG90Mjo6bGFicyh5PSJwcmVkaWN0b3IiLCB4ID0gIm51bWJlciBvZiBub24temVybyBjb2VmZmljaWVudHMgPSA5IiwgY29sb3I9IiUiKQoKYGBgCgpgYGB7cn0KY29lZl9DVlNfSVRVX24gPC0gCmdncGxvdChwbTJfQ1ZTX0lUVV9uX2NvZWYsIGFlcyh5ID0gdmFyaWFibGUsIHg9bWVkaWFuKSkrCmdlb21fcG9pbnQobWFwcGluZyA9IGdncGxvdDI6OmFlcyh5ID0gdmFyaWFibGUsIHNpemUgPW5vbl96ZXJvLCBhbHBoYSA9IG5vbl96ZXJvLCBjb2xvciA9IG5vbl96ZXJvKSkrCnNjYWxlX2NvbG9yX2dyYWRpZW50MihoaWdoID0gJ2dyZWVuJywgbWlkID0gInB1cnBsZSIsIGxvdyA9ICJibGFjayIsIG1pZHBvaW50ID01MCwgbGltaXRzPWMoMCwxMDApKSsKc2NhbGVfYWxwaGEoZ3VpZGUgPSAnbm9uZScpKwpzY2FsZV9zaXplKGd1aWRlID0gJ25vbmUnKSsKZ2VvbV9wb2ludCgpKwpnZW9tX2Vycm9yYmFyKGFlcyh5ID0gdmFyaWFibGUsIHhtaW4gPSBsY2wsIHhtYXggPSB1Y2wpLCB3aWR0aCA9IDAuMikrCmxhYnMoeT0icHJlZGljdG9yIiwgeCA9ICJcbm1lZGlhbiAmIDk1JSBDSSBvZiBjb2VmZmljaWVudCAob3ZlciBib290c3RyYXBzKSIsIGNvbG9yPSIlIikrCnNjYWxlX3hfY29udGludW91cyhsaW1pdHM9YygtMC40LDAuNCksIGJyZWFrcz1jKC0uNCwtLjMsLS4yLCAtLjEsIDAsIC4xLCAuMiwgLjMsIC40KSkrCnNjYWxlX3lfZGlzY3JldGUobGFiZWxzPSBjKCJnZXN0YWdlIGF0IGJpcnRoIiwgImNoaWxkIHNleCAoZmVtYWxlKSIsICJiaXJ0aCB3ZWlnaHQiLCAiYmlydGggbGVuZ3RoIiwgImhlYWQgY2lyY3VtZmVyZW5jZSIsICJkZWxpdmVyeSBtb2RlIChhaWRlZCkiLCAiaW5kdWNlZCBsYWJvciAoeWVzKSIsICJwYXJpdHkgKGJpcnRoIGJlZm9yZSkiLCAibWF0ZXJuYWwgYWdlIiwgIm1hdGVybmFsIEJNSSIsICJtYXRlcm5hbCBoeXBlcnRlbnNpb24gKHllcykiLCAibWF0ZXJuYWwgZGlhYmV0ZXMgKHllcykiLCAibWF0ZXJuYWwgbWVudGFsIGRpc29yZGVycyAoeWVzKSIsICJtYXRlcm5hbCBzbW9raW5nICh5ZXMpIikpKwpnZW9tX3ZsaW5lKHhpbnRlcmNlcHQ9MCwgbGluZXR5cGU9ImRhc2hlZCIpKwp0aGVtZV9idygpKwp0aGVtZSh0ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNSksIGF4aXMudGl0bGUueD0gZWxlbWVudF90ZXh0KHNpemU9MTUpLCBheGlzLnRpdGxlLnk9IGVsZW1lbnRfdGV4dChzaXplPTE1KSkKCgpjb2VmX0NWU19JVFVfbiAKYGBgCgoKYGBge3J9CnBuZyhmaWxlbmFtZT0iUmVzdWx0cy9GaWd1cmVzL2VsYXN0aWNOZXRfc2luZ2xlVGlzc3Vlcy9PdXRjb21lX21haW4vY29lZl9DVlMucG5nIiwgd2lkdGg9MjgwMCwgaGVpZ2h0PTE0MDAsIHJlcz00MDApCmNvZWZfQ1ZTX0lUVV9uIApkZXYub2ZmKCkKYGBgCgpgYGB7cn0KZzFfQ1ZTX0lUVV9uIDwtCiAgY3N1bW1hcnlfQ1ZTX0lUVV9uICU+JQogIG1lbHQoaWQudmFycyA9IGMoIm56ZXJvIiwgIm1lYW5fY3ZtIiwgIm1lZGlhbl9jdm0iKSkgJT4lCiAgZ2dwbG90Mjo6Z2dwbG90KC4pICsKICBnZ3Bsb3QyOjp0aGVtZV9idygpICsKICBnZ3Bsb3QyOjphZXMoeCA9IG56ZXJvKSArCiAgZ2dwbG90Mjo6Z2VvbV9wb2ludChtYXBwaW5nID0gZ2dwbG90Mjo6YWVzKHkgPSB2YXJpYWJsZSwgc2l6ZSA9IHZhbHVlLCBhbHBoYSA9IHZhbHVlLCBjb2xvciA9IHZhbHVlKjEwMCkpICsKICBnZ3Bsb3QyOjpzY2FsZV9jb2xvcl9ncmFkaWVudDIoaGlnaCA9ICdncmVlbicsIG1pZCA9ICJwdXJwbGUiLCBsb3cgPSAiYmxhY2siLCBtaWRwb2ludCA9NTApKwogIGdncGxvdDI6OnNjYWxlX2FscGhhKGd1aWRlID0gJ25vbmUnKSsKICBnZ3Bsb3QyOjpzY2FsZV9zaXplKGd1aWRlID0gJ25vbmUnKSsKICBnZ3Bsb3QyOjpzY2FsZV95X2Rpc2NyZXRlKGxhYmVscz0gYygiZ2VzdGFnZSBhdCBiaXJ0aCIsICJjaGlsZCBzZXggKGZlbWFsZSkiLCAiYmlydGggd2VpZ2h0IiwgImJpcnRoIGxlbmd0aCIsICJoZWFkIGNpcmN1bWZlcmVuY2UiLCAiZGVsaXZlcnkgbW9kZSAoYWlkZWQpIiwgImluZHVjZWQgbGFib3IgKHllcykiLCAicGFyaXR5IChiaXJ0aCBiZWZvcmUpIiwgIm1hdGVybmFsIGFnZSIsICJtYXRlcm5hbCBCTUkiLCAibWF0ZXJuYWwgaHlwZXJ0ZW5zaW9uICh5ZXMpIiwgIm1hdGVybmFsIGRpYWJldGVzICh5ZXMpIiwgIm1hdGVybmFsIG1lbnRhbCBkaXNvcmRlcnMgKHllcykiLCAibWF0ZXJuYWwgc21va2luZyAoeWVzKSIpKSsKICBnZ3Bsb3QyOjpzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzPTA6MTQsIGxhYmVscz0pKwogIGdncGxvdDI6OmxhYnMoeT0icHJlZGljdG9yIiwgeCA9ICJudW1iZXIgb2Ygbm9uLXplcm8gY29lZmZpY2llbnRzIiwgY29sb3I9IiUiKSsKICBnZ3Bsb3QyOjp0aGVtZSh0ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAyMCksIGF4aXMudGl0bGUueD0gZWxlbWVudF90ZXh0KHNpemU9MTUpLCBheGlzLnRpdGxlLnk9IGVsZW1lbnRfdGV4dChzaXplPTE1KSwgbGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKQoKY29lZl9DVlNfSVRVX24gPC0gCmdncGxvdChwbTJfQ1ZTX0lUVV9uX2NvZWYsIGFlcyh5ID0gdmFyaWFibGUsIHg9bWVkaWFuKSkrCmdlb21fcG9pbnQobWFwcGluZyA9IGdncGxvdDI6OmFlcyh5ID0gdmFyaWFibGUsIHNpemUgPW5vbl96ZXJvLCBhbHBoYSA9IG5vbl96ZXJvLCBjb2xvciA9IG5vbl96ZXJvKSkrCnNjYWxlX2NvbG9yX2dyYWRpZW50MihoaWdoID0gJ2dyZWVuJywgbWlkID0gInB1cnBsZSIsIGxvdyA9ICJibGFjayIsIG1pZHBvaW50ID01MCwgbGltaXRzPWMoMCwxMDApKSsKc2NhbGVfYWxwaGEoZ3VpZGUgPSAnbm9uZScpKwpzY2FsZV9zaXplKGd1aWRlID0gJ25vbmUnKSsKZ2VvbV9wb2ludCgpKwpnZW9tX2Vycm9yYmFyKGFlcyh5ID0gdmFyaWFibGUsIHhtaW4gPSBsY2wsIHhtYXggPSB1Y2wpLCB3aWR0aCA9IDAuMikrCmxhYnMoeT0iIiwgeCA9ICJtZWRpYW4gJiA5NSUgQ0kgb2YgY29lZmZpY2llbnQgKG92ZXIgYm9vdHN0cmFwcykiLCBjb2xvcj0iJSIpKwojZ2d0aXRsZSgibnplcm8gPSA4IikrCnNjYWxlX3hfY29udGludW91cyhsaW1pdHM9YygtMC40LDAuNCksIGJyZWFrcz1jKC0uNCwtLjMsLS4yLCAtLjEsIDAsIC4xLCAuMiwgLjMsIC40KSkrCnNjYWxlX3lfZGlzY3JldGUobGFiZWxzPSBjKCJnZXN0YWdlIGF0IGJpcnRoIiwgImNoaWxkIHNleCAoZmVtYWxlKSIsICJiaXJ0aCB3ZWlnaHQiLCAiYmlydGggbGVuZ3RoIiwgImhlYWQgY2lyY3VtZmVyZW5jZSIsICJkZWxpdmVyeSBtb2RlIChhaWRlZCkiLCAiaW5kdWNlZCBsYWJvciAoeWVzKSIsICJwYXJpdHkgKGJpcnRoIGJlZm9yZSkiLCAibWF0ZXJuYWwgYWdlIiwgIm1hdGVybmFsIEJNSSIsICJtYXRlcm5hbCBoeXBlcnRlbnNpb24gKHllcykiLCAibWF0ZXJuYWwgZGlhYmV0ZXMgKHllcykiLCAibWF0ZXJuYWwgbWVudGFsIGRpc29yZGVycyAoeWVzKSIsICJtYXRlcm5hbCBzbW9raW5nICh5ZXMpIikpKwpnZW9tX3ZsaW5lKHhpbnRlcmNlcHQ9MCwgbGluZXR5cGU9ImRhc2hlZCIpKwp0aGVtZV9idygpKwp0aGVtZSh0ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAyMCksIGF4aXMudGl0bGUueD0gZWxlbWVudF90ZXh0KHNpemU9MTUpLCBheGlzLnRpdGxlLnk9IGVsZW1lbnRfdGV4dChzaXplPTE1KSkKI3Bsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZT0xNSkKCmBgYAoKUGxvdDoKYGBge3J9CnAxIDwtCiAgY3N1bW1hcnlfQ1ZTX0lUVV9uICU+JQogIG1lbHQoaWQudmFycyA9IGMoIm56ZXJvIiwgIm1lYW5fY3ZtIiwgIm1lZGlhbl9jdm0iKSkgJT4lCiAgZ2dwbG90Mjo6Z2dwbG90KC4pICsKICBnZ3Bsb3QyOjp0aGVtZV9idygpICsKICBnZ3Bsb3QyOjphZXMoeCA9IG56ZXJvKSArCiAgZ2dwbG90Mjo6Z2VvbV9wb2ludChtYXBwaW5nID0gZ2dwbG90Mjo6YWVzKHkgPSB2YXJpYWJsZSwgc2l6ZSA9IHZhbHVlLCBhbHBoYSA9IHZhbHVlLCBjb2xvciA9IHZhbHVlKjEwMCkpICsKICBnZ3Bsb3QyOjpzY2FsZV9jb2xvcl9ncmFkaWVudDIoaGlnaCA9ICdncmVlbicsIG1pZCA9ICJwdXJwbGUiLCBsb3cgPSAiYmxhY2siLCBtaWRwb2ludCA9NTApKwogIGdncGxvdDI6OnNjYWxlX2FscGhhKGd1aWRlID0gJ25vbmUnKSsKICBnZ3Bsb3QyOjpzY2FsZV9zaXplKGd1aWRlID0gJ25vbmUnKSsKICBnZ3Bsb3QyOjpzY2FsZV95X2Rpc2NyZXRlKGxhYmVscz0gYygiZ2VzdGFnZSBhdCBiaXJ0aCIsICJjaGlsZCBzZXggKGZlbWFsZSkiLCAiYmlydGggd2VpZ2h0IiwgImJpcnRoIGxlbmd0aCIsICJoZWFkIGNpcmN1bWZlcmVuY2UiLCAiZGVsaXZlcnkgbW9kZSAoYWlkZWQpIiwgImluZHVjZWQgbGFib3IgKHllcykiLCAicGFyaXR5IChiaXJ0aCBiZWZvcmUpIiwgIm1hdGVybmFsIGFnZSIsICJtYXRlcm5hbCBCTUkiLCAibWF0ZXJuYWwgaHlwZXJ0ZW5zaW9uICh5ZXMpIiwgIm1hdGVybmFsIGRpYWJldGVzICh5ZXMpIiwgIm1hdGVybmFsIG1lbnRhbCBkaXNvcmRlcnMgKHllcykiLCAibWF0ZXJuYWwgc21va2luZyAoeWVzKSIpKSsKICBnZ3Bsb3QyOjpzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzPTA6MTQsIGxhYmVscz0pKwogIGdncGxvdDI6OmxhYnMoeT0icHJlZGljdG9yIiwgeCA9ICJcbm51bWJlciBvZiBub24temVybyBjb2VmZmljaWVudHMiLCBjb2xvcj0iJSIpKwogIGdncGxvdDI6OnRoZW1lKHRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE3KSwgYXhpcy50aXRsZS54PSBlbGVtZW50X3RleHQoc2l6ZT0xNSksIGF4aXMudGl0bGUueT0gZWxlbWVudF90ZXh0KHNpemU9MTUpLCBsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpCgpwMiA8LSAKZ2dwbG90KHBtMl9DVlNfSVRVX25fY29lZiwgYWVzKHkgPSB2YXJpYWJsZSwgeD1tZWRpYW4pKSsKZ2VvbV9wb2ludChtYXBwaW5nID0gZ2dwbG90Mjo6YWVzKHkgPSB2YXJpYWJsZSwgc2l6ZSA9bm9uX3plcm8sIGFscGhhID0gbm9uX3plcm8sIGNvbG9yID0gbm9uX3plcm8pKSsKc2NhbGVfY29sb3JfZ3JhZGllbnQyKGhpZ2ggPSAnZ3JlZW4nLCBtaWQgPSAicHVycGxlIiwgbG93ID0gImJsYWNrIiwgbWlkcG9pbnQgPTUwLCBsaW1pdHM9YygwLDEwMCkpKwpzY2FsZV9hbHBoYShndWlkZSA9ICdub25lJykrCnNjYWxlX3NpemUoZ3VpZGUgPSAnbm9uZScpKwpnZW9tX3BvaW50KCkrCmdlb21fZXJyb3JiYXIoYWVzKHkgPSB2YXJpYWJsZSwgeG1pbiA9IGxjbCwgeG1heCA9IHVjbCksIHdpZHRoID0gMC4yKSsKbGFicyh5PSIiLCB4ID0gIlxubWVkaWFuICYgOTUlIENJIG9mIGNvZWZmaWNpZW50IChvdmVyIGJvb3RzdHJhcHMpIiwgY29sb3I9IiUiKSsKZ2d0aXRsZSgibnplcm8gPSA4IikrCnNjYWxlX3hfY29udGludW91cyhsaW1pdHM9YygtMC40LDAuNCksIGJyZWFrcz1jKC0uNCwtLjMsLS4yLCAtLjEsIDAsIC4xLCAuMiwgLjMsIC40KSkrCnNjYWxlX3lfZGlzY3JldGUobGFiZWxzPSBjKCJnZXN0YWdlIGF0IGJpcnRoIiwgImNoaWxkIHNleCAoZmVtYWxlKSIsICJiaXJ0aCB3ZWlnaHQiLCAiYmlydGggbGVuZ3RoIiwgImhlYWQgY2lyY3VtZmVyZW5jZSIsICJkZWxpdmVyeSBtb2RlIChhaWRlZCkiLCAiaW5kdWNlZCBsYWJvciAoeWVzKSIsICJwYXJpdHkgKGJpcnRoIGJlZm9yZSkiLCAibWF0ZXJuYWwgYWdlIiwgIm1hdGVybmFsIEJNSSIsICJtYXRlcm5hbCBoeXBlcnRlbnNpb24gKHllcykiLCAibWF0ZXJuYWwgZGlhYmV0ZXMgKHllcykiLCAibWF0ZXJuYWwgbWVudGFsIGRpc29yZGVycyAoeWVzKSIsICJtYXRlcm5hbCBzbW9raW5nICh5ZXMpIikpKwpnZW9tX3ZsaW5lKHhpbnRlcmNlcHQ9MCwgbGluZXR5cGU9ImRhc2hlZCIpKwp0aGVtZV9idygpKwp0aGVtZSh0ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNyksIGF4aXMudGl0bGUueD0gZWxlbWVudF90ZXh0KHNpemU9MTUpLCBheGlzLnRpdGxlLnk9IGVsZW1lbnRfdGV4dChzaXplPTE1KSwgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplPTE1KSwgYXhpcy50ZXh0Lnk9ZWxlbWVudF9ibGFuaygpKQoKZzEgPC0gZ2dwbG90R3JvYihwMSkKZzIgPC0gZ2dwbG90R3JvYihwMikKZyA8LSBjYmluZChnMSwgZzIsIHNpemUgPSAibGFzdCIpCmckaGVpZ2h0cyA8LSB1bml0LnBtYXgoZzEkaGVpZ2h0cywgZzIkaGVpZ2h0cykKCnBuZyhmaWxlbmFtZT0iUmVzdWx0cy9GaWd1cmVzL2VsYXN0aWNOZXRfc2luZ2xlVGlzc3Vlcy9PdXRjb21lX21haW4vTW9kZWxfY29lZl9DVlMucG5nIiwgd2lkdGg9NTgwMCwgaGVpZ2h0PTE2MDAsIHJlcz00MDApCmdyaWQuZHJhdyhnKQpkZXYub2ZmKCkKYGBgCgpbdG8gdGhlIHRvcF0oI3RvcCkKCiMjIENWUyBlbGFzdGljIG5ldCB7I2VsYXN0aWNuZXRDVlNJVFVfYX0gIAphZGRpdGlvbmFsIG1vZGVsLCB3aXRoIGFsY29ob2wgdmFyaWFibGUKCmBgYHtyfQojIGluIGNhc2UgeW91IHdhbnQgdG8gc3RhcnQgZnJvbSBoZXJlCmxvYWQoIklucHV0RGF0YS9DbG9ja0NhbGN1bGF0aW9uc0lucHV0L1JlZ19JbnB1dF9EYXRhX0NWU19JVFVfRUFBUl93YV9ub05hLlJkYXRhIikKYGBgCgoKYGBge3J9CnlyY19tYXRfSVRVX0NWU193YSA8LSBtYXRyaXgoUmVnX0lucHV0X0RhdGFfQ1ZTX0lUVV9FQUFSX3dhX25vTmEkRUFBUl9MZWUpCnhyY19tYXRfSVRVX0NWU193YSA8LSBtb2RlbC5tYXRyaXgoIH4gLiAtIEVBQVJfTGVlLCBkYXRhID0gUmVnX0lucHV0X0RhdGFfQ1ZTX0lUVV9FQUFSX3dhX25vTmEpWywgLTFdCnlyY19tYXRfSVRVX3NjYWxlZF9DVlNfd2EgPC0gc2NhbGUoeXJjX21hdF9JVFVfQ1ZTX3dhKQp4cmNfbWF0X0lUVV9zY2FsZWRfQ1ZTX3dhIDwtIHNjYWxlKHhyY19tYXRfSVRVX0NWU193YSkKYGBgCgoKPCEtLSBzZXQgc2VlZCAtLT4KPCEtLSBgYGB7cn0gLS0+CjwhLS0gc2V0LnNlZWQoMjAyMCkgLS0+CjwhLS0gYGBgIC0tPgoKCjwhLS0gYGBge3IsIHdhcm5pbmc9RkFMU0V9IC0tPgo8IS0tIG5ib290ID0gMTAwMCAtLT4KCjwhLS0gc3RhcnRfdGltZSA8LSBTeXMudGltZSgpIC0tPgo8IS0tIGJvb3RzdHJhcHNfQ1ZTX0lUVV93YSA8LSByZXBsaWNhdGUobmJvb3QsIHsgLS0+CjwhLS0gICByd3MgPC0gc2FtcGxlKDE6bnJvdyh4cmNfbWF0X0lUVV9zY2FsZWRfQ1ZTX3dhKSwgcmVwbGFjZSA9IFRSVUUpIC0tPgo8IS0tICAgZW5zcih4cmNfbWF0X0lUVV9zY2FsZWRfQ1ZTX3dhW3J3cywgXSwgeXJjX21hdF9JVFVfc2NhbGVkX0NWU193YVtyd3MsIF0sIHN0YW5kYXJkaXplZCA9IEZBTFNFLCBmYW1pbHk9ImdhdXNzaWFuIiwgbmxhbWJkYT0xMDAsIG5mb2xkcz0xMCwgYWxwaGE9YygwLjAsMC4xLDAuMiwwLjMsMC40LDAuNSwwLjYsMC43LDAuOCwwLjksMS4wKSkgLS0+CjwhLS0gfSwgLS0+CjwhLS0gc2ltcGxpZnkgPSBGQUxTRSkgLS0+Cgo8IS0tIGVuZF90aW1lIDwtIFN5cy50aW1lKCkgLS0+CjwhLS0gZW5kX3RpbWUgLSBzdGFydF90aW1lIC0tPgo8IS0tICMgZ2VuZXJhdGVzIGEgbGlzdCBvZiBsZW5ndGggMTAwLCBlYWNoIGEgdW5pcXVlIGNhbGwgdG8gZW5zciAoPSBhbHNvIGEgbGlzdCBvZiBjdi5nbG1uZXQgb2JqZWN0cywgd2hpY2ggaXMgZGV0ZXJtaW5lZCBieSB0aGUgbGVuZ3RoIG9mIGFscGhhcykgLS0+CjwhLS0gIyBubGFtYmRhID0gbnVtYmVyIG9mIGxhbWJkYSB2YWx1ZXMsIGRlZmF1bHQgMTAwIC0tPgo8IS0tICMgYWxwaGE6IHNlcXVlbmNlIG9mIGFscGhhcyB0byB1c2UsIGVuc3Igd2lsbCBhZGQgbGVuZ3RoKGFscGhhcyktMSBhZGRpdGlvbmFsIHZhbHVlcyAobWlkcG9pbnRzKSBpbiB0aGUgY29uc3RydWN0aW9uIG9mIHRoZSBhbHBoYS1sYW1iZGEgZ3JpZCB0byBzZWFyY2ggLS0+CjwhLS0gIyBuZm9sZD0gbnVtYmVyIG9mIGZvbGRzIChkZWZhdWx0IDEwKSBmb3IgaW50ZXJuYWwgY3YgdG8gZml0IGh5cGVycGFyYW1ldGVycyAtLT4KCjwhLS0gYGBgIC0tPgoKCjwhLS0gYGBge3J9IC0tPgo8IS0tICMgc2F2ZSBib290c3RyYXAgb2JqZWN0IC0tPgo8IS0tIHNhdmUoYm9vdHN0cmFwc19DVlNfSVRVX3dhLCBmaWxlPSJJbnB1dERhdGEvRGF0YV9FbGFzdGljTmV0cy9ib290c3RyYXBzX0NWU19JVFVfd2FfMTAwMC5SZGF0YSIpIC0tPgo8IS0tIGBgYCAtLT4KCgpgYGB7cn0KbG9hZCgiSW5wdXREYXRhL0RhdGFfRWxhc3RpY05ldHMvYm9vdHN0cmFwc19DVlNfSVRVX3dhXzEwMDAuUmRhdGEiKQpgYGAKCgpgYGB7cn0Kc3VtbWFyaWVzX0NWU19JVFVfd2EgPC0KICBib290c3RyYXBzX0NWU19JVFVfd2EgJT4lCiAgbGFwcGx5KHN1bW1hcnkpICU+JQogIHJiaW5kbGlzdChpZGNvbCA9ICJib290c3RyYXAiKQoKc3VtbWFyaWVzX0NWU19JVFVfd2EKYGBgCgpgYGB7cn0Kc3VtbWFyaWVzX0NWU19JVFVfd2FbLCAuU0RbY3ZtID09IG1pbihjdm0pXSwgYnkgPSBjKCJib290c3RyYXAiLCAibnplcm8iKV0gJT4lCiAgZ2dwbG90Mjo6Z2dwbG90KGRhdGEgPSAuKSArCiAgZ2dwbG90Mjo6YWVzKHggPSBuemVybywgeSA9IGN2bSwgZ3JvdXAgPSBib290c3RyYXApICsKICBnZ3Bsb3QyOjpnZW9tX3BvaW50KCkgKwogIGdncGxvdDI6Omdlb21fbGluZSgpCmBgYAoKCmBgYHtyfQpwbmcoZmlsZW5hbWU9IlJlc3VsdHMvRmlndXJlcy9lbGFzdGljTmV0X3NpbmdsZVRpc3N1ZXMvT3V0Y29tZV9hZGQvYWxjb2hvbC9ib290c3RyYXBzX0NWUy5wbmciLCB3aWR0aD04MDAsIGhlaWdodD02MDApCnN1bW1hcmllc19DVlNfSVRVX3dhWywgLlNEW2N2bSA9PSBtaW4oY3ZtKV0sIGJ5ID0gYygiYm9vdHN0cmFwIiwgIm56ZXJvIildICU+JQogIGdncGxvdDI6OmdncGxvdChkYXRhID0gLikgKwogIGdncGxvdDI6OmFlcyh4ID0gbnplcm8sIHkgPSBjdm0sIGdyb3VwID0gYm9vdHN0cmFwKSArCiAgZ2dwbG90Mjo6Z2VvbV9wb2ludCgpICsKICBnZ3Bsb3QyOjpnZW9tX2xpbmUoKQpkZXYub2ZmKCkKYGBgCgoKPCEtLSBgYGB7ciwgd2FybmluZz1GQUxTRX0gLS0+CjwhLS0gIyBsb3dlc3QgY3ZtIGJ5IGJvb3RzdHJhcCBhbmQgbnplcm8gLS0+CjwhLS0gcG1fQ1ZTX0lUVV93YSA8LSBzdW1tYXJpZXNfQ1ZTX0lUVV93YVssIC5TRFtjdm0gPT0gbWluKGN2bSldLCBieSA9IGMoImJvb3RzdHJhcCIsICJuemVybyIpXSAtLT4KPCEtLSBwbTJfQ1ZTX0lUVV93YSA8LSBOVUxMIC0tPgoKPCEtLSBmb3IoaSBpbiBhcy5pbnRlZ2VyKHNlcSgxLCBucm93KHBtX0NWU19JVFVfd2EpLCBieSA9IDEpKSkgeyAtLT4KPCEtLSAgIHBtMl9DVlNfSVRVX3dhIDwtIHJiaW5kKHBtMl9DVlNfSVRVX3dhLCAtLT4KPCEtLSAgICAgICAgICAgICAgICBjYmluZChwbV9DVlNfSVRVX3dhW2ksIF0sIC0tPgo8IS0tICAgICAgICAgICAgICAgIHQoYXMubWF0cml4KGNvZWYoYm9vdHN0cmFwc19DVlNfSVRVX3dhW1twbV9DVlNfSVRVX3dhW2ksIGJvb3RzdHJhcF1dXVtbcG1fQ1ZTX0lUVV93YVtpLCBsX2luZGV4XV1dLCBzID0gcG1fQ1ZTX0lUVV93YVtpLCBsYW1iZGFdKSkpIC0tPgo8IS0tICAgICAgICAgICAgICAgICkgLS0+CjwhLS0gICApIC0tPgo8IS0tIH0gLS0+Cgo8IS0tIHBtMl9DVlNfSVRVX3dhIC0tPgo8IS0tIGBgYCAtLT4KCgo8IS0tIGBgYHtyfSAtLT4KPCEtLSAjIHNhdmUgInByZWZlcmFibGUgbW9kZWxzIiAtLT4KPCEtLSBzYXZlKHBtMl9DVlNfSVRVX3dhLCBmaWxlPSJJbnB1dERhdGEvRGF0YV9FbGFzdGljTmV0cy9wbTJfQ1ZTX0lUVV93YS5SZGF0YSIpIC0tPgo8IS0tIGBgYCAtLT4KCgpgYGB7cn0KbG9hZCgiSW5wdXREYXRhL0RhdGFfRWxhc3RpY05ldHMvcG0yX0NWU19JVFVfd2EuUmRhdGEiKQpgYGAKCgpgYGB7cn0KY3N1bW1hcnlfQ1ZTX0lUVV93YSA8LSBSZWR1Y2UoZnVuY3Rpb24oeCx5KSBtZXJnZSh4ID0geCwgeSA9IHksIGJ5ID0gIm56ZXJvIiksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0KHBtMl9DVlNfSVRVX3dhWywgbGFwcGx5KC5TRCwgZnVuY3Rpb24oeCkge21lYW4oeCAhPSAwKX0pLCAuU0Rjb2xzID0gYygiR2VzdGF0aW9uYWxfQWdlX1dlZWtzIiwgIkNoaWxkX1NleGZlbWFsZSIsICJDaGlsZF9CaXJ0aF9XZWlnaHQiLCAiQ2hpbGRfQmlydGhfTGVuZ3RoIiwgIkNoaWxkX0hlYWRfQ2lyY3VtZmVyZW5jZV9BdF9CaXJ0aCIsICJEZWxpdmVyeV9tb2RlX2RpY2hvdG9tYWlkZWQiLCAiSW5kdWNlZF9MYWJvdXJ5ZXMiLCAiUGFyaXR5X2RpY2hvdG9tZ2l2ZW4gYmlydGggYmVmb3JlIiwgIk1hdGVybmFsX0FnZV9ZZWFycyIsICJNYXRlcm5hbF9Cb2R5X01hc3NfSW5kZXhfaW5fRWFybHlfUHJlZ25hbmN5IiwgIk1hdGVybmFsX0h5cGVydGVuc2lvbl9kaWNob3RvbWh5cGVydGVuc2lvbiBpbiBjdXJyZW50IHByZWduYW5jeSIsICJNYXRlcm5hbF9EaWFiZXRlc19kaWNob3RvbWRpYWJldGVzIGluIGN1cnJlbnQgcHJlZ25hbmN5IiwgIk1hdGVybmFsX01lbnRhbF9EaXNvcmRlcnNZZXMiLCAic21va2luZ19kaWNob3RvbXllcyIKLCAibWF0ZXJuYWxfYWxjb2hvbF91c2V5ZXMiKSwgYnkgPSBuemVyb10KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG0yX0NWU19JVFVfd2FbLCAuKG1lYW5fY3ZtID0gbWVhbihjdm0pKSwgYnkgPSBuemVyb10sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG0yX0NWU19JVFVfd2FbLCAuKG1lZGlhbl9jdm0gPSBtZWRpYW4oY3ZtKSksIGJ5ID0gbnplcm9dCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkpW29yZGVyKG56ZXJvKV0KCmNzdW1tYXJ5X0NWU19JVFVfd2EKYGBgCgoKYGBge3IsIGZpZy53aWR0aD04LCBmaWcuaGVpZ3RoPTh9CmcxX0NWU19JVFVfd2EgPC0KICBjc3VtbWFyeV9DVlNfSVRVX3dhICU+JQogIG1lbHQoaWQudmFycyA9IGMoIm56ZXJvIiwgIm1lYW5fY3ZtIiwgIm1lZGlhbl9jdm0iKSkgJT4lCiAgZ2dwbG90Mjo6Z2dwbG90KC4pICsKICBnZ3Bsb3QyOjp0aGVtZV9idygpICsKICBnZ3Bsb3QyOjphZXMoeCA9IG56ZXJvKSArCiAgZ2dwbG90Mjo6Z2VvbV9wb2ludChtYXBwaW5nID0gZ2dwbG90Mjo6YWVzKHkgPSB2YXJpYWJsZSwgc2l6ZSA9IHZhbHVlLCBhbHBoYSA9IHZhbHVlLCBjb2xvciA9IHZhbHVlKjEwMCkpICsKICBnZ3Bsb3QyOjpzY2FsZV9jb2xvcl9ncmFkaWVudDIoaGlnaCA9ICdncmVlbicsIG1pZCA9ICJwdXJwbGUiLCBsb3cgPSAiYmxhY2siLCBtaWRwb2ludCA9NTApKwogIGdncGxvdDI6OnNjYWxlX2FscGhhKGd1aWRlID0gJ25vbmUnKSsKICBnZ3Bsb3QyOjpzY2FsZV9zaXplKGd1aWRlID0gJ25vbmUnKSsKICBnZ3Bsb3QyOjpzY2FsZV95X2Rpc2NyZXRlKGxhYmVscz0gYygiZ2VzdGFnZSBhdCBiaXJ0aCIsICJjaGlsZCBzZXgiLCAiYmlydGggd2VpZ2h0IiwgImJpcnRoIGxlbmd0aCIsICJoZWFkIGNpcmN1bWZlcmVuY2UiLCAiZGVsaXZlcnkgbW9kZSIsICJpbmR1Y2VkIGxhYm9yIiwgInBhcml0eSIsICJtYXRlcm5hbCBhZ2UiLCAibWF0ZXJuYWwgQk1JIiwgIm1hdGVybmFsIGh5cGVydGVuc2lvbiIsICJtYXRlcm5hbCBkaWFiZXRlcyIsICJtYXRlcm5hbCBtZW50YWwgZGlzb3JkZXJzIiwgIm1hdGVybmFsIHNtb2tpbmciLCAibWF0ZXJuYWwgYWxjb2hvbCB1c2UiKSkrCiAgZ2dwbG90Mjo6c2NhbGVfeF9jb250aW51b3VzKGJyZWFrcz0wOjE0LCBsYWJlbHM9KSsKICBnZ3Bsb3QyOjpsYWJzKHk9InByZWRpY3RvciIsIHggPSAibnVtYmVyIG9mIG5vbi16ZXJvIGNvZWZmaWNpZW50cyIsIGNvbG9yPSIlIikrCiAgZ2dwbG90Mjo6dGhlbWUodGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTUpLCBheGlzLnRpdGxlLng9IGVsZW1lbnRfdGV4dChzaXplPTE1KSwgYXhpcy50aXRsZS55PSBlbGVtZW50X3RleHQoc2l6ZT0xNSkpCiAgCgpnMl9DVlNfSVRVX3dhIDwtCiAgY3N1bW1hcnlfQ1ZTX0lUVV93YSAlPiUKICBnZ3Bsb3QyOjpnZ3Bsb3QoLikgKwogIGdncGxvdDI6OnRoZW1lX2J3KCkgKwogIGdncGxvdDI6OmFlcyh4ID0gbnplcm8sIHkgPSBtZWRpYW5fY3ZtKSArCiAgZ2dwbG90Mjo6Z2VvbV9wb2ludCgpICsgZ2dwbG90Mjo6Z2VvbV9saW5lKCkrCiAgZ2dwbG90Mjo6bGFicyh5PSJtZWRpYW4gY3ZtIiwgeCA9ICJudW1iZXIgb2Ygbm9uLXplcm8gY29lZmZpY2llbnRzIikrCiAgZ2dwbG90Mjo6c2NhbGVfeF9jb250aW51b3VzKGJyZWFrcz0wOjE0LCBsYWJlbHM9KSsKICBnZ3Bsb3QyOjp0aGVtZShheGlzLnRleHQ9ZWxlbWVudF90ZXh0KHNpemU9MTUpLGF4aXMudGl0bGU9ZWxlbWVudF90ZXh0KHNpemU9MTgpKQoKZ3JpZEV4dHJhOjpncmlkLmFycmFuZ2UoZzFfQ1ZTX0lUVV93YSwgZzJfQ1ZTX0lUVV93YSwgbmNvbCA9IDEpCgojIG5vdGU6IG5vdCBhIGJpZyBkaWZmZXJlbmNlIGlmIG1lYW4vbWVkaWFuIGN2bSBpcyB1c2VkCmBgYAoKYGBge3J9CnBuZyhmaWxlbmFtZT0iUmVzdWx0cy9GaWd1cmVzL2VsYXN0aWNOZXRfc2luZ2xlVGlzc3Vlcy9PdXRjb21lX2FkZC9hbGNvaG9sL01vZGVsX0NWUy5wbmciLCB3aWR0aD0yODAwLCBoZWlnaHQ9MTQwMCwgcmVzPTQwMCkKZzFfQ1ZTX0lUVV93YQpkZXYub2ZmKCkKYGBgCgoKYGBge3J9CnBuZyhmaWxlbmFtZT0iUmVzdWx0cy9GaWd1cmVzL2VsYXN0aWNOZXRfc2luZ2xlVGlzc3Vlcy9PdXRjb21lX2FkZC9hbGNvaG9sL2Jvb3RzdHJhcE1vZGVsc19DVlMucG5nIiwgd2lkdGg9MjQwMCwgaGVpZ2h0PTE4MDAsIHJlcz0zMDApCmdyaWRFeHRyYTo6Z3JpZC5hcnJhbmdlKGcxX0NWU19JVFVfd2EsIGcyX0NWU19JVFVfd2EsIG5jb2wgPSAxKQpkZXYub2ZmKCkKYGBgCgoKYGBge3J9CmVsYm93X2ZpbmRlcihjc3VtbWFyeV9DVlNfSVRVX3dhJG56ZXJvLCBjc3VtbWFyeV9DVlNfSVRVX3dhJG1lZGlhbl9jdm0pCm56ZXJvX2luZGljZXNfQ1ZTIDwtIGRhdGEuZnJhbWUodChlbGJvd19maW5kZXIoY3N1bW1hcnlfQ1ZTX0lUVV93YSRuemVybywgY3N1bW1hcnlfQ1ZTX0lUVV93YSRtZWRpYW5fY3ZtKSkpCmNvbG5hbWVzKG56ZXJvX2luZGljZXNfQ1ZTKSA8LSBjKCJ4IiwgInkiKQpyb3duYW1lcyhuemVyb19pbmRpY2VzX0NWUykgPC0gTlVMTApgYGAKCmBgYHtyfQpub256ZXJvX2Nob29zZV9DVlMgPC0gZ2dwbG90Mjo6Z2dwbG90KGNzdW1tYXJ5X0NWU19JVFVfd2EpICsKICBnZ3Bsb3QyOjp0aGVtZV9idygpKwogIGdncGxvdDI6OmFlcyh4ID0gbnplcm8sIHkgPSBtZWRpYW5fY3ZtKSArCiAgZ2dwbG90Mjo6c2NhbGVfeF9jb250aW51b3VzKGJyZWFrcz1jKDA6MTcpKSsKICBnZ3Bsb3QyOjpnZW9tX3BvaW50KCkgKyBnZ3Bsb3QyOjpnZW9tX2xpbmUoKSsKICBnZ3Bsb3QyOjpnZW9tX3BvaW50KGRhdGE9bnplcm9faW5kaWNlc19DVlMsIGFlcyh4PXgsIHk9eSksIGNvbG91cj0icmVkIiwgc2l6ZT0yKSsKICBnZ3Bsb3QyOjp5bGFiKCJtZWRpYW4gb2YgbWluaW11bSBjcm9zcy12YWxpZGF0aW9uIGVycm9ycyBvdmVyIGJvb3RzdHJhcHMiKSsKICBnZ3Bsb3QyOjp4bGFiKCJudW1iZXIgb2Ygbm9uLXplcm8gY29lZmZpY2llbnRzIikrCiAgZ2dwbG90Mjo6Z2VvbV9zZWdtZW50KGFlcyh4ID0gbnplcm9bMV0sIHkgPSBtZWRpYW5fY3ZtWzFdLCB4ZW5kID0gbnplcm9bMTZdLCB5ZW5kID0gbWVkaWFuX2N2bVsxNl0sIGNvbG91ciA9ICJzZWdtZW50IiksIGRhdGEgPSBjc3VtbWFyeV9DVlNfSVRVX3dhLCBzaG93LmxlZ2VuZCA9IEYpCgpub256ZXJvX2Nob29zZV9DVlMKYGBgCgoKYGBge3J9CnBuZyhmaWxlbmFtZT0iUmVzdWx0cy9GaWd1cmVzL2VsYXN0aWNOZXRfc2luZ2xlVGlzc3Vlcy9PdXRjb21lX2FkZC9hbGNvaG9sL256ZXJvX2Nob29zZV9DVlMucG5nIiwgd2lkdGg9MTYwMCwgaGVpZ2h0PTE0MDAsIHJlcz0zMDApCm5vbnplcm9fY2hvb3NlX0NWUwpkZXYub2ZmKCkKYGBgCgpgYGB7cn0Kbnplcm9fZmluYWxfQ1ZTX3dhIDwtIDEwCmBgYAoKYGBge3J9CmNzdW1tYXJ5X0NWU19JVFVfd2Fbbnplcm8gJWluJSBuemVyb19maW5hbF9DVlNfd2FdCmBgYAoKCmBgYHtyfQpzdW1tYXJ5X0NWU19JVFVfd2FfZmluYWxuemVybyA8LSBjc3VtbWFyeV9DVlNfSVRVX3dhW256ZXJvICVpbiUgbnplcm9fZmluYWxfQ1ZTX3dhXQpzaWdfdmFyX25hbWVzX0NWU19JVFVfd2FfZmluYWxuemVybyA8LSBGaWx0ZXIoZnVuY3Rpb24oeCkgYW55KHggPiAwLjc1KSwgc3VtbWFyeV9DVlNfSVRVX3dhX2ZpbmFsbnplcm9bLCFjKCJuemVybyIsICJtZWFuX2N2bSIsICJtZWRpYW5fY3ZtIildKSAlPiUgY29sbmFtZXMoKQpjb2xuYW1lcyhzdW1tYXJ5X0NWU19JVFVfd2FfZmluYWxuemVybykgPC0gYygibm9uLXplcm8iLCAiZ2VzdGFnZSBhdCBiaXJ0aCIsICJjaGlsZCBzZXggKGZlbWFsZSkiLCAiYmlydGggd2VpZ2h0IiwgImJpcnRoIGxlbmd0aCIsICJoZWFkIGNpcmN1bWZlcmVuY2UiLCAiZGVsaXZlcnkgbW9kZSAoYWlkZWQpIiwgImluZHVjZWQgbGFib3IgKHllcykiLCAicGFyaXR5IChiaXJ0aCBiZWZvcmUpIiwgIm1hdGVybmFsIGFnZSIsICJtYXRlcm5hbCBCTUkiLCAibWF0ZXJuYWwgaHlwZXJ0ZW5zaW9uICh5ZXMpIiwgIm1hdGVybmFsIGRpYWJldGVzICh5ZXMpIiwgIm1hdGVybmFsIG1lbnRhbCBkaXNvcmRlcnMgKHllcykiLCAibWF0ZXJuYWwgc21va2luZyAoeWVzKSIsICJtYXRlcm5hbCBhbGNvaG9sICh5ZXMpIiwgIm1lYW4gY3ZtIiwgIm1lZGlhbiBjdm0iKQpzdW1tYXJ5X0NWU19JVFVfd2FfZmluYWxuemVyb1QgPC0gYXMuZGF0YS5mcmFtZSh0KHN1bW1hcnlfQ1ZTX0lUVV93YV9maW5hbG56ZXJvWywtYygibm9uLXplcm8iLCAibWVkaWFuIGN2bSIsICJtZWFuIGN2bSIpXSkpCnN1bW1hcnlfQ1ZTX0lUVV93YV9maW5hbG56ZXJvVCR2YXJpYWJsZSA8LSByb3duYW1lcyhzdW1tYXJ5X0NWU19JVFVfd2FfZmluYWxuemVyb1QpCnJvd25hbWVzKHN1bW1hcnlfQ1ZTX0lUVV93YV9maW5hbG56ZXJvVCkgPC0gTlVMTApuYW1lcyhzdW1tYXJ5X0NWU19JVFVfd2FfZmluYWxuemVyb1QpW25hbWVzKHN1bW1hcnlfQ1ZTX0lUVV93YV9maW5hbG56ZXJvVCkgPT0gJ1YxJ10gPC0gJ3BlcmNlbnQnCnN1bW1hcnlfQ1ZTX0lUVV93YV9maW5hbG56ZXJvVCA8LSBzdW1tYXJ5X0NWU19JVFVfd2FfZmluYWxuemVyb1Rbb3JkZXIoc3VtbWFyeV9DVlNfSVRVX3dhX2ZpbmFsbnplcm9UJHBlcmNlbnQpLF0KCnN1bW1hcnlfQ1ZTX0lUVV93YV9maW5hbG56ZXJvVCRudW1iZXIgPC0gc2VxKDEsIGxlbmd0aChzdW1tYXJ5X0NWU19JVFVfd2FfZmluYWxuemVyb1QkdmFyaWFibGUpKQpgYGAKCgpgYGB7ciwgZmlnLndpZHRoPTh9CnBlcmNfdmFyc19DVlNfSVRVX3dhIDwtIApnZ3Bsb3Qoc3VtbWFyeV9DVlNfSVRVX3dhX2ZpbmFsbnplcm9ULCBhZXMocmVvcmRlcih2YXJpYWJsZSwgcGVyY2VudCksIHBlcmNlbnQsIGdyb3VwPTEpKSsKZ2VvbV9wb2ludCgpKyBnZW9tX2xpbmUoKSsKeWxhYigiJSBvY2N1cmVuY2UgaW4gbW9kZWxzIHdpdGggbnplcm8gY29lZmZpY2llbnRzID0gOCIpKwpzY2FsZV95X2NvbnRpbnVvdXMoYnJlYWtzPWMoMC4xLDAuMiwwLjMsMC40LDAuNSwwLjYsMC43LDAuOCwwLjkpKSsKeGxhYigidmFyaWFibGUiKSsKY29vcmRfZmxpcCgpKwpnZW9tX2hsaW5lKHlpbnRlcmNlcHQ9MC43NSwgbGluZXR5cGU9ImRvdHRlZCIpKwp0aGVtZV9idygpCgpwZXJjX3ZhcnNfQ1ZTX0lUVV93YQoKIyBkZWNpZGUgZm9yIGN1dC1vZmYgJSAtPiBoZXJlIC43NQoKRmlsdGVyKGZ1bmN0aW9uKHgpIGFueSh4ID4gMC43NSksIHN1bW1hcnlfQ1ZTX0lUVV93YV9maW5hbG56ZXJvWywhYygibm9uLXplcm8iLCAibWVhbiBjdm0iLCAibWVkaWFuIGN2bSIpXSkKCmBgYAoKYGBge3J9CnBuZyhmaWxlbmFtZT0iUmVzdWx0cy9GaWd1cmVzL2VsYXN0aWNOZXRfc2luZ2xlVGlzc3Vlcy9PdXRjb21lX2FkZC9hbGNvaG9sL3ZhcnNQZXJjZW50X0NWUy5wbmciLCB3aWR0aD0xMTAwLCBoZWlnaHQ9MTQwMCwgcmVzPTMwMCkKcGVyY192YXJzX0NWU19JVFVfd2EKZGV2Lm9mZigpCmBgYAoKCmBgYHtyfQpwbTJfQ1ZTX0lUVV93YV9jb2VmIDwtCmRjYXN0KHBtMl9DVlNfSVRVX3dhWywKYXMubGlzdCh1bmxpc3QoCmxhcHBseSguU0QsCmZ1bmN0aW9uKHgpIHsKeSA8LSB1bm5hbWUocXVhbnRpbGUoeFt4ICE9IDBdLCBwcm9icyA9IGMoMC4wMjUsIDAuOTc1KSkpCmxpc3QoIm5vbl96ZXJvIiA9IDEwMCAqIG1lYW4oeCAhPSAwKSwKbGNsID0geVsxXSwKdWNsID0geVsyXSwKd2lkdGggPSBkaWZmKHkpLAptZWRpYW4gPSBtZWRpYW4oeFt4IT0gMF0pKQp9KSkpLAouU0Rjb2xzID0gYygiR2VzdGF0aW9uYWxfQWdlX1dlZWtzIiwgIkNoaWxkX1NleGZlbWFsZSIsICJDaGlsZF9CaXJ0aF9XZWlnaHQiLCAiQ2hpbGRfQmlydGhfTGVuZ3RoIiwgIkNoaWxkX0hlYWRfQ2lyY3VtZmVyZW5jZV9BdF9CaXJ0aCIsICJEZWxpdmVyeV9tb2RlX2RpY2hvdG9tYWlkZWQiLCAiSW5kdWNlZF9MYWJvdXJ5ZXMiLCAiUGFyaXR5X2RpY2hvdG9tZ2l2ZW4gYmlydGggYmVmb3JlIiwgIk1hdGVybmFsX0FnZV9ZZWFycyIsICJNYXRlcm5hbF9Cb2R5X01hc3NfSW5kZXhfaW5fRWFybHlfUHJlZ25hbmN5IiwgIk1hdGVybmFsX0h5cGVydGVuc2lvbl9kaWNob3RvbWh5cGVydGVuc2lvbiBpbiBjdXJyZW50IHByZWduYW5jeSIsICJNYXRlcm5hbF9EaWFiZXRlc19kaWNob3RvbWRpYWJldGVzIGluIGN1cnJlbnQgcHJlZ25hbmN5IiwgIk1hdGVybmFsX01lbnRhbF9EaXNvcmRlcnNZZXMiLCAic21va2luZ19kaWNob3RvbXllcyIsICJtYXRlcm5hbF9hbGNvaG9sX3VzZXllcyIpLApieSA9IG56ZXJvXVtvcmRlcihuemVybyldICU+JQptZWx0KGlkLnZhciA9ICJuemVybyIpICU+JQouWywgbWV0cmljIDo9IHN1YigiXi4rXFwuKC4rKSQiLCAiXFwxIiwgdmFyaWFibGUpXSAlPiUKLlssIHZhcmlhYmxlIDo9IHN1YigiXiguKylcXC4uKyQiLCAiXFwxIiwgdmFyaWFibGUpXSAlPiUKLltuemVybyA9PSBuemVyb19maW5hbF9DVlNfd2FdLCBuemVybysgdmFyaWFibGUgfiBtZXRyaWMsIHZhbHVlLnZhcj0idmFsdWUiKQoKIyBnZXQgZGVzaXJlZCBvcmRlciBvZiBwcmVkaWN0b3JzCnBtMl9DVlNfSVRVX3dhX2NvZWYgPC0KcG0yX0NWU19JVFVfd2FfY29lZlttYXRjaChjKCJHZXN0YXRpb25hbF9BZ2VfV2Vla3MiLCAiQ2hpbGRfU2V4ZmVtYWxlIiwgIkNoaWxkX0JpcnRoX1dlaWdodCIsICJDaGlsZF9CaXJ0aF9MZW5ndGgiLCAiQ2hpbGRfSGVhZF9DaXJjdW1mZXJlbmNlX0F0X0JpcnRoIiwgIkRlbGl2ZXJ5X21vZGVfZGljaG90b21haWRlZCIsICJJbmR1Y2VkX0xhYm91cnllcyIsICJQYXJpdHlfZGljaG90b21naXZlbiBiaXJ0aCBiZWZvcmUiLCAiTWF0ZXJuYWxfQWdlX1llYXJzIiwgIk1hdGVybmFsX0JvZHlfTWFzc19JbmRleF9pbl9FYXJseV9QcmVnbmFuY3kiLCAiTWF0ZXJuYWxfSHlwZXJ0ZW5zaW9uX2RpY2hvdG9taHlwZXJ0ZW5zaW9uIGluIGN1cnJlbnQgcHJlZ25hbmN5IiwgIk1hdGVybmFsX0RpYWJldGVzX2RpY2hvdG9tZGlhYmV0ZXMgaW4gY3VycmVudCBwcmVnbmFuY3kiLCAiTWF0ZXJuYWxfTWVudGFsX0Rpc29yZGVyc1llcyIsICJzbW9raW5nX2RpY2hvdG9teWVzIiwgIm1hdGVybmFsX2FsY29ob2xfdXNleWVzIiksIHBtMl9DVlNfSVRVX3dhX2NvZWYkdmFyaWFibGUpLF0KcG0yX0NWU19JVFVfd2FfY29lZiR2YXJpYWJsZSA8LSBmYWN0b3IocG0yX0NWU19JVFVfd2FfY29lZiR2YXJpYWJsLCBsZXZlbHM9dW5pcXVlKHBtMl9DVlNfSVRVX3dhX2NvZWYkdmFyaWFibGUpKQoKIyMgTk9URTogbWVkaWFuIGlzIHVzZWQgaGVyZSBpbnN0ZWFkIG9mIG1lYW4KIyBtYWtlIGZyYW1lIGZvciBvbmx5IHNpZ25pZmljYW50IHZhcmlhYmxlczoKcG0yX0NWU19JVFVfd2FfZGF0YWJsZSA8LSBkY2FzdChwbTJfQ1ZTX0lUVV93YVssCmFzLmxpc3QodW5saXN0KApsYXBwbHkoLlNELApmdW5jdGlvbih4KSB7CnkgPC0gdW5uYW1lKHF1YW50aWxlKHhbeCAhPSAwXSwgcHJvYnMgPSBjKDAuMDI1LCAwLjk3NSkpKQpsaXN0KCJub25femVybyIgPSAxMDAgKiBtZWFuKHggIT0gMCksCmxjbCA9IHlbMV0sCnVjbCA9IHlbMl0sCndpZHRoID0gZGlmZih5KSwKbWVkaWFuID0gbWVkaWFuKHhbeCE9IDBdKSkKfSkpKSwKLlNEY29scyA9IGMoIkdlc3RhdGlvbmFsX0FnZV9XZWVrcyIsICJDaGlsZF9TZXhmZW1hbGUiLCAiQ2hpbGRfQmlydGhfV2VpZ2h0IiwgIkNoaWxkX0JpcnRoX0xlbmd0aCIsICJDaGlsZF9IZWFkX0NpcmN1bWZlcmVuY2VfQXRfQmlydGgiLCAiRGVsaXZlcnlfbW9kZV9kaWNob3RvbWFpZGVkIiwgIkluZHVjZWRfTGFib3VyeWVzIiwgIlBhcml0eV9kaWNob3RvbWdpdmVuIGJpcnRoIGJlZm9yZSIsICJNYXRlcm5hbF9BZ2VfWWVhcnMiLCAiTWF0ZXJuYWxfQm9keV9NYXNzX0luZGV4X2luX0Vhcmx5X1ByZWduYW5jeSIsICJNYXRlcm5hbF9IeXBlcnRlbnNpb25fZGljaG90b21oeXBlcnRlbnNpb24gaW4gY3VycmVudCBwcmVnbmFuY3kiLCAiTWF0ZXJuYWxfRGlhYmV0ZXNfZGljaG90b21kaWFiZXRlcyBpbiBjdXJyZW50IHByZWduYW5jeSIsICJNYXRlcm5hbF9NZW50YWxfRGlzb3JkZXJzWWVzIiwgInNtb2tpbmdfZGljaG90b215ZXMiLCAibWF0ZXJuYWxfYWxjb2hvbF91c2V5ZXMiKSwKYnkgPSBuemVyb11bb3JkZXIobnplcm8pXSAlPiUKbWVsdChpZC52YXIgPSAibnplcm8iKSAlPiUKLlssIG1ldHJpYyA6PSBzdWIoIl4uK1xcLiguKykkIiwgIlxcMSIsIHZhcmlhYmxlKV0gJT4lCi5bLCB2YXJpYWJsZSA6PSBzdWIoIl4oLispXFwuLiskIiwgIlxcMSIsIHZhcmlhYmxlKV0gJT4lCiMgcHJpbnQgJT4lCi5bbnplcm8gPT0gbnplcm9fZmluYWxfQ1ZTX3dhICYgdmFyaWFibGUgJWluJSBzaWdfdmFyX25hbWVzX0NWU19JVFVfd2FfZmluYWxuemVyb10sIG56ZXJvKyB2YXJpYWJsZSB+IG1ldHJpYywgdmFsdWUudmFyPSJ2YWx1ZSIpCgpwbTJfQ1ZTX0lUVV93YV9kYXRhYmxlIApgYGAKCmBgYHtyfQpzaWdfdmFyc19DVlNfSVRVX3dhIDwtCnBtMl9DVlNfSVRVX3dhX2NvZWYgJT4lCiAgZ2dwbG90Mjo6Z2dwbG90KC4pICsKICBnZ3Bsb3QyOjp0aGVtZV9idygpICsKICBnZ3Bsb3QyOjp0aGVtZShheGlzLnRleHQueD1lbGVtZW50X2JsYW5rKCkpKwogIGdncGxvdDI6OmFlcyh4PSJuemVybyIpKwogIGdncGxvdDI6Omdlb21fcG9pbnQobWFwcGluZyA9IGdncGxvdDI6OmFlcyh5ID0gdmFyaWFibGUsIHNpemUgPW5vbl96ZXJvLCBhbHBoYSA9IG5vbl96ZXJvLCBjb2xvciA9IG5vbl96ZXJvKSkgKwogIGdncGxvdDI6Omdlb21fdGV4dChhZXMoeT12YXJpYWJsZSwgbGFiZWw9c3ByaW50ZigiJTAuMmYiLCByb3VuZChtZWRpYW4sIGRpZ2l0cz0yKSksIHNpemU9MzApLGhqdXN0PTAsIHZqdXN0PTAuNSwgbnVkZ2VfeCA9IDAuMSkrCiAgZ2dwbG90Mjo6c2NhbGVfY29sb3JfZ3JhZGllbnQyKGhpZ2ggPSAnZ3JlZW4nLCBtaWQgPSAicHVycGxlIiwgbG93ID0gImJsYWNrIiwgbWlkcG9pbnQgPTUwKSsKICBnZ3Bsb3QyOjpzY2FsZV9hbHBoYShndWlkZSA9ICdub25lJykrCiAgZ2dwbG90Mjo6c2NhbGVfc2l6ZShndWlkZSA9ICdub25lJykrCiAgZ2dwbG90Mjo6c2NhbGVfeV9kaXNjcmV0ZShsYWJlbHM9IGMoImdlc3RhZ2UgYXQgYmlydGgiLCAiY2hpbGQgc2V4IChmZW1hbGUpIiwgImJpcnRoIHdlaWdodCIsICJiaXJ0aCBsZW5ndGgiLCAiaGVhZCBjaXJjdW1mZXJlbmNlIiwgImRlbGl2ZXJ5IG1vZGUgKGFpZGVkKSIsICJpbmR1Y2VkIGxhYm9yICh5ZXMpIiwgInBhcml0eSAoYmlydGggYmVmb3JlKSIsICJtYXRlcm5hbCBhZ2UiLCAibWF0ZXJuYWwgQk1JIiwgIm1hdGVybmFsIGh5cGVydGVuc2lvbiAoeWVzKSIsICJtYXRlcm5hbCBkaWFiZXRlcyAoeWVzKSIsICJtYXRlcm5hbCBtZW50YWwgZGlzb3JkZXJzICh5ZXMpIiwgIm1hdGVybmFsIHNtb2tpbmcgKHllcykiLCAibWF0ZXJuYWwgYWxjb2hvbCB1c2UgKHllcykiKSkrCiAgZ2dwbG90Mjo6bGFicyh5PSJwcmVkaWN0b3IiLCB4ID0gIm51bWJlciBvZiBub24temVybyBjb2VmZmljaWVudHMgPSA4IiwgY29sb3I9IiUiKQoKYGBgCgpgYGB7cn0KY29lZl9DVlNfSVRVX3dhIDwtIAogIGdncGxvdChwbTJfQ1ZTX0lUVV93YV9jb2VmLCBhZXMoeSA9IHZhcmlhYmxlLCB4PW1lZGlhbikpKwogIGdlb21fcG9pbnQobWFwcGluZyA9IGdncGxvdDI6OmFlcyh5ID0gdmFyaWFibGUsIHNpemUgPW5vbl96ZXJvLCBhbHBoYSA9IG5vbl96ZXJvLCBjb2xvciA9IG5vbl96ZXJvKSkrCiAgc2NhbGVfY29sb3JfZ3JhZGllbnQyKGhpZ2ggPSAnZ3JlZW4nLCBtaWQgPSAicHVycGxlIiwgbG93ID0gImJsYWNrIiwgbWlkcG9pbnQgPTUwLCBsaW1pdHM9YygwLDEwMCkpKwogIHNjYWxlX2FscGhhKGd1aWRlID0gJ25vbmUnKSsKICBzY2FsZV9zaXplKGd1aWRlID0gJ25vbmUnKSsKICBnZW9tX3BvaW50KCkrCiAgZ2VvbV9lcnJvcmJhcihhZXMoeSA9IHZhcmlhYmxlLCB4bWluID0gbGNsLCB4bWF4ID0gdWNsKSwgd2lkdGggPSAwLjIpKwogIGxhYnMoeT0icHJlZGljdG9yIiwgeCA9ICJcbm1lZGlhbiAmIDk1JSBDSSBvZiBjb2VmZmljaWVudCAob3ZlciBib290c3RyYXBzKSIsIGNvbG9yPSIlIikrCiAgc2NhbGVfeF9jb250aW51b3VzKGxpbWl0cz1jKC0wLjUsMC40KSwgYnJlYWtzPWMoLS41LCAtLjQsLS4zLC0uMiwgLS4xLCAwLCAuMSwgLjIsIC4zLCAuNCkpKwogIHNjYWxlX3lfZGlzY3JldGUobGFiZWxzPSBjKCJnZXN0YWdlIGF0IGJpcnRoIiwgImNoaWxkIHNleCAoZmVtYWxlKSIsICJiaXJ0aCB3ZWlnaHQiLCAiYmlydGggbGVuZ3RoIiwgImhlYWQgY2lyY3VtZmVyZW5jZSIsICJkZWxpdmVyeSBtb2RlIChhaWRlZCkiLCAiaW5kdWNlZCBsYWJvciAoeWVzKSIsICJwYXJpdHkgKGJpcnRoIGJlZm9yZSkiLCAibWF0ZXJuYWwgYWdlIiwgIm1hdGVybmFsIEJNSSIsICJtYXRlcm5hbCBoeXBlcnRlbnNpb24gKHllcykiLCAibWF0ZXJuYWwgZGlhYmV0ZXMgKHllcykiLCAibWF0ZXJuYWwgbWVudGFsIGRpc29yZGVycyAoeWVzKSIsICJtYXRlcm5hbCBzbW9raW5nICh5ZXMpIiwgIm1hdGVybmFsIGFsY29ob2wgdXNlICh5ZXMpIikpKwogIGdlb21fdmxpbmUoeGludGVyY2VwdD0wLCBsaW5ldHlwZT0iZGFzaGVkIikrCiAgdGhlbWVfYncoKSsKICB0aGVtZSh0ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNSksIGF4aXMudGl0bGUueD0gZWxlbWVudF90ZXh0KHNpemU9MTUpLCBheGlzLnRpdGxlLnk9IGVsZW1lbnRfdGV4dChzaXplPTE1KSkKCmNvZWZfQ1ZTX0lUVV93YQpgYGAKCgpgYGB7cn0KcG5nKGZpbGVuYW1lPSJSZXN1bHRzL0ZpZ3VyZXMvZWxhc3RpY05ldF9zaW5nbGVUaXNzdWVzL091dGNvbWVfYWRkL2FsY29ob2wvY29lZl9DVlMucG5nIiwgd2lkdGg9MjgwMCwgaGVpZ2h0PTE0MDAsIHJlcz00MDApCmNvZWZfQ1ZTX0lUVV93YSAKZGV2Lm9mZigpCmBgYAoKYGBge3J9CnAxIDwtCiAgZzFfQ1ZTX0lUVV93YSA8LQogIGNzdW1tYXJ5X0NWU19JVFVfd2EgJT4lCiAgbWVsdChpZC52YXJzID0gYygibnplcm8iLCAibWVhbl9jdm0iLCAibWVkaWFuX2N2bSIpKSAlPiUKICBnZ3Bsb3QyOjpnZ3Bsb3QoLikgKwogIGdncGxvdDI6OnRoZW1lX2J3KCkgKwogIGdncGxvdDI6OmFlcyh4ID0gbnplcm8pICsKICBnZ3Bsb3QyOjpnZW9tX3BvaW50KG1hcHBpbmcgPSBnZ3Bsb3QyOjphZXMoeSA9IHZhcmlhYmxlLCBzaXplID0gdmFsdWUsIGFscGhhID0gdmFsdWUsIGNvbG9yID0gdmFsdWUqMTAwKSkgKwogIGdncGxvdDI6OnNjYWxlX2NvbG9yX2dyYWRpZW50MihoaWdoID0gJ2dyZWVuJywgbWlkID0gInB1cnBsZSIsIGxvdyA9ICJibGFjayIsIG1pZHBvaW50ID01MCkrCiAgZ2dwbG90Mjo6c2NhbGVfYWxwaGEoZ3VpZGUgPSAnbm9uZScpKwogIGdncGxvdDI6OnNjYWxlX3NpemUoZ3VpZGUgPSAnbm9uZScpKwogIGdncGxvdDI6OnNjYWxlX3lfZGlzY3JldGUobGFiZWxzPSBjKCJnZXN0YWdlIGF0IGJpcnRoIiwgImNoaWxkIHNleCAoZmVtYWxlKSIsICJiaXJ0aCB3ZWlnaHQiLCAiYmlydGggbGVuZ3RoIiwgImhlYWQgY2lyY3VtZmVyZW5jZSIsICJkZWxpdmVyeSBtb2RlIChhaWRlZCkiLCAiaW5kdWNlZCBsYWJvciAoeWVzKSIsICJwYXJpdHkgKGJpcnRoIGJlZm9yZSkiLCAibWF0ZXJuYWwgYWdlIiwgIm1hdGVybmFsIEJNSSIsICJtYXRlcm5hbCBoeXBlcnRlbnNpb24gKHllcykiLCAibWF0ZXJuYWwgZGlhYmV0ZXMgKHllcykiLCAibWF0ZXJuYWwgbWVudGFsIGRpc29yZGVycyAoeWVzKSIsICJtYXRlcm5hbCBzbW9raW5nICh5ZXMpIiwgIm1hdGVybmFsIGFsY29ob2wgdXNlICh5ZXMpIikpKwogIGdncGxvdDI6OnNjYWxlX3hfY29udGludW91cyhicmVha3M9MDoxNSwgbGFiZWxzPSkrCiAgZ2dwbG90Mjo6bGFicyh5PSJwcmVkaWN0b3IiLCB4ID0gIlxubnVtYmVyIG9mIG5vbi16ZXJvIGNvZWZmaWNpZW50cyIsIGNvbG9yPSIlIikrCiAgZ2dwbG90Mjo6dGhlbWUodGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTcpLCBheGlzLnRpdGxlLng9IGVsZW1lbnRfdGV4dChzaXplPTE1KSwgYXhpcy50aXRsZS55PSBlbGVtZW50X3RleHQoc2l6ZT0xNSksIGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikKICAKcDIgPC0gCiAgZ2dwbG90KHBtMl9DVlNfSVRVX3dhX2NvZWYsIGFlcyh5ID0gdmFyaWFibGUsIHg9bWVkaWFuKSkrCiAgZ2VvbV9wb2ludChtYXBwaW5nID0gZ2dwbG90Mjo6YWVzKHkgPSB2YXJpYWJsZSwgc2l6ZSA9bm9uX3plcm8sIGFscGhhID0gbm9uX3plcm8sIGNvbG9yID0gbm9uX3plcm8pKSsKICBzY2FsZV9jb2xvcl9ncmFkaWVudDIoaGlnaCA9ICdncmVlbicsIG1pZCA9ICJwdXJwbGUiLCBsb3cgPSAiYmxhY2siLCBtaWRwb2ludCA9NTAsIGxpbWl0cz1jKDAsMTAwKSkrCiAgc2NhbGVfYWxwaGEoZ3VpZGUgPSAnbm9uZScpKwogIHNjYWxlX3NpemUoZ3VpZGUgPSAnbm9uZScpKwogIGdlb21fcG9pbnQoKSsKICBnZW9tX2Vycm9yYmFyKGFlcyh5ID0gdmFyaWFibGUsIHhtaW4gPSBsY2wsIHhtYXggPSB1Y2wpLCB3aWR0aCA9IDAuMikrCiAgbGFicyh5PSIiLCB4ID0gIlxubWVkaWFuICYgOTUlIENJIG9mIGNvZWZmaWNpZW50IChvdmVyIGJvb3RzdHJhcHMpIiwgY29sb3I9IiUiKSsKICBnZ3RpdGxlKCJuemVybyA9IDEwIikrCiAgc2NhbGVfeF9jb250aW51b3VzKGxpbWl0cz1jKC0wLjUsMC40KSwgYnJlYWtzPWMoLS41LCAtLjQsLS4zLC0uMiwgLS4xLCAwLCAuMSwgLjIsIC4zLCAuNCkpKwogIHNjYWxlX3lfZGlzY3JldGUobGFiZWxzPSBjKCJnZXN0YWdlIGF0IGJpcnRoIiwgImNoaWxkIHNleCAoZmVtYWxlKSIsICJiaXJ0aCB3ZWlnaHQiLCAiYmlydGggbGVuZ3RoIiwgImhlYWQgY2lyY3VtZmVyZW5jZSIsICJkZWxpdmVyeSBtb2RlIChhaWRlZCkiLCAiaW5kdWNlZCBsYWJvciAoeWVzKSIsICJwYXJpdHkgKGJpcnRoIGJlZm9yZSkiLCAibWF0ZXJuYWwgYWdlIiwgIm1hdGVybmFsIEJNSSIsICJtYXRlcm5hbCBoeXBlcnRlbnNpb24gKHllcykiLCAibWF0ZXJuYWwgZGlhYmV0ZXMgKHllcykiLCAibWF0ZXJuYWwgbWVudGFsIGRpc29yZGVycyAoeWVzKSIsICJtYXRlcm5hbCBzbW9raW5nICh5ZXMpIiwgIm1hdGVybmFsIGFsY29ob2wgdXNlICh5ZXMpIikpKwogIGdlb21fdmxpbmUoeGludGVyY2VwdD0wLCBsaW5ldHlwZT0iZGFzaGVkIikrCiAgdGhlbWVfYncoKSsKICB0aGVtZSh0ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNyksIGF4aXMudGl0bGUueD0gZWxlbWVudF90ZXh0KHNpemU9MTUpLCBheGlzLnRpdGxlLnk9IGVsZW1lbnRfdGV4dChzaXplPTE1KSwgLCBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MTUpLCBheGlzLnRleHQueT1lbGVtZW50X2JsYW5rKCkpCgpnMSA8LSBnZ3Bsb3RHcm9iKHAxKQpnMiA8LSBnZ3Bsb3RHcm9iKHAyKQpnIDwtIGNiaW5kKGcxLCBnMiwgc2l6ZSA9ICJsYXN0IikKZyRoZWlnaHRzIDwtIHVuaXQucG1heChnMSRoZWlnaHRzLCBnMiRoZWlnaHRzKQoKcG5nKGZpbGVuYW1lPSJSZXN1bHRzL0ZpZ3VyZXMvZWxhc3RpY05ldF9zaW5nbGVUaXNzdWVzL091dGNvbWVfYWRkL2FsY29ob2wvTW9kZWxfY29lZl9DVlMucG5nIiwgd2lkdGg9NTgwMCwgaGVpZ2h0PTE2MDAsIHJlcz00MDApCmdyaWQuZHJhdyhnKQpkZXYub2ZmKCkKYGBgCgoKIyMgUGxhY2VudGEgZWxhc3RpYyBuZXQgeyNlbGFzdGljbmV0UGxhY2VudGFJVFV9ICAKbWFpbiBtb2RlbCwgd2l0aG91dCBhbGNvaG9sIHZhcmlhYmxlCgpgYGB7cn0KIyBpbiBjYXNlIHlvdSB3YW50IHRvIHN0YXJ0IGZyb20gaGVyZQpsb2FkKCJJbnB1dERhdGEvQ2xvY2tDYWxjdWxhdGlvbnNJbnB1dC9SZWdfSW5wdXRfRGF0YV9QbGFjZW50YV9JVFVfRUFBUl9ub05hX24uUmRhdGEiKQpgYGAKCgpgYGB7cn0KeXJjX21hdF9JVFVfUGxhY2VudGFfbiA8LSBtYXRyaXgoUmVnX0lucHV0X0RhdGFfUGxhY2VudGFfSVRVX0VBQVJfbm9OYV9uJEVBQVJfTGVlKQp4cmNfbWF0X0lUVV9QbGFjZW50YV9uIDwtIG1vZGVsLm1hdHJpeCggfiAuIC0gRUFBUl9MZWUsIGRhdGEgPSBSZWdfSW5wdXRfRGF0YV9QbGFjZW50YV9JVFVfRUFBUl9ub05hX24pWywgLTFdCnlyY19tYXRfSVRVX3NjYWxlZF9QbGFjZW50YV9uIDwtIHNjYWxlKHlyY19tYXRfSVRVX1BsYWNlbnRhX24pCnhyY19tYXRfSVRVX3NjYWxlZF9QbGFjZW50YV9uIDwtIHNjYWxlKHhyY19tYXRfSVRVX1BsYWNlbnRhX24pCmBgYAoKPCEtLSBzZXQgc2VlZCAtLT4KPCEtLSBgYGB7cn0gLS0+CjwhLS0gc2V0LnNlZWQoMjAyMCkgLS0+CjwhLS0gYGBgIC0tPgoKCjwhLS0gYGBge3IsIHdhcm5pbmc9Rn0gLS0+CjwhLS0gICBuYm9vdCA9IDEwMDAgLS0+Cgo8IS0tICAgc3RhcnRfdGltZSA8LSBTeXMudGltZSgpIC0tPgo8IS0tICAgYm9vdHN0cmFwc19QbGFjZW50YV9JVFVfbiA8LSByZXBsaWNhdGUobmJvb3QsIHsgLS0+CjwhLS0gICAgIHJ3cyA8LSBzYW1wbGUoMTpucm93KHhyY19tYXRfSVRVX3NjYWxlZF9QbGFjZW50YV9uKSwgcmVwbGFjZSA9IFRSVUUpIC0tPgo8IS0tICAgICBlbnNyKHhyY19tYXRfSVRVX3NjYWxlZF9QbGFjZW50YV9uW3J3cywgXSwgeXJjX21hdF9JVFVfc2NhbGVkX1BsYWNlbnRhX25bcndzLCBdLCBzdGFuZGFyZGl6ZWQgPSBGQUxTRSwgZmFtaWx5PSJnYXVzc2lhbiIsIG5sYW1iZGE9MTAwLCBuZm9sZHM9MTAsIGFscGhhPWMoMC4wLDAuMSwwLjIsMC4zLDAuNCwwLjUsMC42LDAuNywwLjgsMC45LDEuMCkpIC0tPgo8IS0tICAgfSwgLS0+CjwhLS0gICBzaW1wbGlmeSA9IEZBTFNFKSAtLT4KCjwhLS0gICBlbmRfdGltZSA8LSBTeXMudGltZSgpIC0tPgo8IS0tICAgZW5kX3RpbWUgLSBzdGFydF90aW1lIC0tPgoKPCEtLSAgICNUaW1lIGRpZmZlcmVuY2Ugb2YgMy4xNTkzMTkgaG91cnMgLS0+Cgo8IS0tIGBgYCAtLT4KCjwhLS0gYGBge3J9IC0tPgo8IS0tIHNhdmUoYm9vdHN0cmFwc19QbGFjZW50YV9JVFVfbiwgZmlsZT0iSW5wdXREYXRhL0RhdGFfRWxhc3RpY05ldHMvYm9vdHN0cmFwc19QbGFjZW50YV9JVFVfbl8xMDAwLlJkYXRhIikgLS0+CjwhLS0gYGBgIC0tPgoKCmBgYHtyfQpsb2FkKCJJbnB1dERhdGEvRGF0YV9FbGFzdGljTmV0cy9ib290c3RyYXBzX1BsYWNlbnRhX0lUVV9uXzEwMDAuUmRhdGEiKQpgYGAKCgpgYGB7cn0Kc3VtbWFyaWVzX1BsYWNlbnRhX0lUVV9uIDwtCiAgYm9vdHN0cmFwc19QbGFjZW50YV9JVFVfbiAlPiUKICBsYXBwbHkoc3VtbWFyeSkgJT4lCiAgcmJpbmRsaXN0KGlkY29sID0gImJvb3RzdHJhcCIpCgpzdW1tYXJpZXNfUGxhY2VudGFfSVRVX24KYGBgCgoKYGBge3J9CnN1bW1hcmllc19QbGFjZW50YV9JVFVfblssIC5TRFtjdm0gPT0gbWluKGN2bSldLCBieSA9IGMoImJvb3RzdHJhcCIsICJuemVybyIpXSAlPiUKICBnZ3Bsb3QyOjpnZ3Bsb3QoZGF0YSA9IC4pICsKICBnZ3Bsb3QyOjphZXMoeCA9IG56ZXJvLCB5ID0gY3ZtLCBncm91cCA9IGJvb3RzdHJhcCkgKwogIGdncGxvdDI6Omdlb21fcG9pbnQoKSArCiAgZ2dwbG90Mjo6Z2VvbV9saW5lKCkKYGBgCgoKYGBge3J9CnBuZyhmaWxlbmFtZT0iUmVzdWx0cy9GaWd1cmVzL2VsYXN0aWNOZXRfc2luZ2xlVGlzc3Vlcy9PdXRjb21lX21haW4vYm9vdHN0cmFwc19QbGFjZW50YS5wbmciLCB3aWR0aD04MDAsIGhlaWdodD02MDApCnN1bW1hcmllc19QbGFjZW50YV9JVFVfblssIC5TRFtjdm0gPT0gbWluKGN2bSldLCBieSA9IGMoImJvb3RzdHJhcCIsICJuemVybyIpXSAlPiUKICBnZ3Bsb3QyOjpnZ3Bsb3QoZGF0YSA9IC4pICsKICBnZ3Bsb3QyOjphZXMoeCA9IG56ZXJvLCB5ID0gY3ZtLCBncm91cCA9IGJvb3RzdHJhcCkgKwogIGdncGxvdDI6Omdlb21fcG9pbnQoKSArCiAgZ2dwbG90Mjo6Z2VvbV9saW5lKCkKZGV2Lm9mZigpCmBgYAoKCjwhLS0gYGBge3IsIHdhcm5pbmc9RkFMU0V9IC0tPgo8IS0tICMgbG93ZXN0IGN2bSBieSBib290c3RyYXAgYW5kIG56ZXJvIC0tPgo8IS0tIHBtX1BsYWNlbnRhX0lUVV9uIDwtIHN1bW1hcmllc19QbGFjZW50YV9JVFVfblssIC5TRFtjdm0gPT0gbWluKGN2bSldLCBieSA9IGMoImJvb3RzdHJhcCIsICJuemVybyIpXSAtLT4KPCEtLSBwbTJfUGxhY2VudGFfSVRVX24gPC0gTlVMTCAtLT4KCjwhLS0gZm9yKGkgaW4gYXMuaW50ZWdlcihzZXEoMSwgbnJvdyhwbV9QbGFjZW50YV9JVFVfbiksIGJ5ID0gMSkpKSB7IC0tPgo8IS0tICAgcG0yX1BsYWNlbnRhX0lUVV9uIDwtIHJiaW5kKHBtMl9QbGFjZW50YV9JVFVfbiwgLS0+CjwhLS0gICAgICAgICAgICAgICAgY2JpbmQocG1fUGxhY2VudGFfSVRVX25baSwgXSwgLS0+CjwhLS0gICAgICAgICAgICAgICAgdChhcy5tYXRyaXgoY29lZihib290c3RyYXBzX1BsYWNlbnRhX0lUVV9uW1twbV9QbGFjZW50YV9JVFVfbltpLCBib290c3RyYXBdXV1bW3BtX1BsYWNlbnRhX0lUVV9uW2ksIGxfaW5kZXhdXV0sIHMgPSBwbV9QbGFjZW50YV9JVFVfbltpLCBsYW1iZGFdKSkpIC0tPgo8IS0tICAgICAgICAgICAgICAgICkgLS0+CjwhLS0gICApIC0tPgo8IS0tIH0gLS0+Cgo8IS0tIHBtMl9QbGFjZW50YV9JVFVfbiAtLT4KPCEtLSBgYGAgLS0+CgoKPCEtLSBgYGB7cn0gLS0+CjwhLS0gIyBzYXZlICJwcmVmZXJhYmxlIG1vZGVscyIgLS0+CjwhLS0gc2F2ZShwbTJfUGxhY2VudGFfSVRVX24sIGZpbGU9IklucHV0RGF0YS9EYXRhX0VsYXN0aWNOZXRzL3BtMl9QbGFjZW50YV9JVFVfbi5SZGF0YSIpIC0tPgo8IS0tIGBgYCAtLT4KCgpgYGB7cn0KbG9hZCgiSW5wdXREYXRhL0RhdGFfRWxhc3RpY05ldHMvcG0yX1BsYWNlbnRhX0lUVV9uLlJkYXRhIikKIyBjb2VmZmljaWVudCB2YWx1ZXMgZm9yIHRoZSBtb2RlbHMgd2l0aCBzbWFsbGVzdCBjdm0gYnkgbnVtYmVyIG9mIG5vbi1lcnpvIGNvZWZmaWNpZW50cyBhbmQgYm9vdHN0cmFwCmBgYAoKCmBgYHtyfQpjc3VtbWFyeV9QbGFjZW50YV9JVFVfbiA8LSBSZWR1Y2UoZnVuY3Rpb24oeCx5KSBtZXJnZSh4ID0geCwgeSA9IHksIGJ5ID0gIm56ZXJvIiksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3QocG0yX1BsYWNlbnRhX0lUVV9uWywgbGFwcGx5KC5TRCwgZnVuY3Rpb24oeCkge21lYW4oeCAhPSAwKX0pLCAuU0Rjb2xzID0gYygiQ2hpbGRfU2V4ZmVtYWxlIiwgIkNoaWxkX0JpcnRoX1dlaWdodCIsICJDaGlsZF9CaXJ0aF9MZW5ndGgiLCAiQ2hpbGRfSGVhZF9DaXJjdW1mZXJlbmNlX0F0X0JpcnRoIiwgIkRlbGl2ZXJ5X21vZGVfZGljaG90b21haWRlZCIsICJJbmR1Y2VkX0xhYm91cnllcyIsICJQYXJpdHlfZGljaG90b21naXZlbiBiaXJ0aCBiZWZvcmUiLCAiTWF0ZXJuYWxfQWdlX1llYXJzIiwgIk1hdGVybmFsX0JvZHlfTWFzc19JbmRleF9pbl9FYXJseV9QcmVnbmFuY3kiLCAiTWF0ZXJuYWxfSHlwZXJ0ZW5zaW9uX2RpY2hvdG9taHlwZXJ0ZW5zaW9uIGluIGN1cnJlbnQgcHJlZ25hbmN5IiwgIk1hdGVybmFsX0RpYWJldGVzX2RpY2hvdG9tZGlhYmV0ZXMgaW4gY3VycmVudCBwcmVnbmFuY3kiLCAiTWF0ZXJuYWxfTWVudGFsX0Rpc29yZGVyc1llcyIsICJzbW9raW5nX2RpY2hvdG9teWVzIiksIGJ5ID0gbnplcm9dCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbTJfUGxhY2VudGFfSVRVX25bLCAuKG1lYW5fY3ZtID0gbWVhbihjdm0pKSwgYnkgPSBuemVyb10sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbTJfUGxhY2VudGFfSVRVX25bLCAuKG1lZGlhbl9jdm0gPSBtZWRpYW4oY3ZtKSksIGJ5ID0gbnplcm9dCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSlbb3JkZXIobnplcm8pXQoKY3N1bW1hcnlfUGxhY2VudGFfSVRVX24KYGBgCgoKYGBge3J9CmcxX1BsYWNlbnRhX0lUVV9uIDwtCiAgY3N1bW1hcnlfUGxhY2VudGFfSVRVX24gJT4lCiAgbWVsdChpZC52YXJzID0gYygibnplcm8iLCAibWVhbl9jdm0iLCAibWVkaWFuX2N2bSIpKSAlPiUKICBnZ3Bsb3QyOjpnZ3Bsb3QoLikgKwogIGdncGxvdDI6OnRoZW1lX2J3KCkgKwogIGdncGxvdDI6OmFlcyh4ID0gbnplcm8pICsKICBnZ3Bsb3QyOjpnZW9tX3BvaW50KG1hcHBpbmcgPSBnZ3Bsb3QyOjphZXMoeSA9IHZhcmlhYmxlLCBzaXplID0gdmFsdWUsIGFscGhhID0gdmFsdWUsIGNvbG9yID0gdmFsdWUqMTAwKSkgKwogIGdncGxvdDI6OnNjYWxlX2NvbG9yX2dyYWRpZW50MihoaWdoID0gJ2dyZWVuJywgbWlkID0gInB1cnBsZSIsIGxvdyA9ICJibGFjayIsIG1pZHBvaW50ID01MCkrCiAgZ2dwbG90Mjo6c2NhbGVfYWxwaGEoZ3VpZGUgPSAnbm9uZScpKwogIGdncGxvdDI6OnNjYWxlX3NpemUoZ3VpZGUgPSAnbm9uZScpKwogIGdncGxvdDI6OnNjYWxlX3lfZGlzY3JldGUobGFiZWxzPSBjKCJjaGlsZCBzZXgiLCAiYmlydGggd2VpZ2h0IiwgImJpcnRoIGxlbmd0aCIsICJoZWFkIGNpcmN1bWZlcmVuY2UiLCAiZGVsaXZlcnkgbW9kZSIsICJpbmR1Y2VkIGxhYm9yIiwgInBhcml0eSIsICJtYXRlcm5hbCBhZ2UiLCAibWF0ZXJuYWwgQk1JIiwgIm1hdGVybmFsIGh5cGVydGVuc2lvbiIsICJtYXRlcm5hbCBkaWFiZXRlcyIsICJtYXRlcm5hbCBtZW50YWwgZGlzb3JkZXJzIiwgIm1hdGVybmFsIHNtb2tpbmciKSkrCiAgZ2dwbG90Mjo6c2NhbGVfeF9jb250aW51b3VzKGJyZWFrcz0wOjE0LCBsYWJlbHM9KSsKICBnZ3Bsb3QyOjpsYWJzKHk9InByZWRpY3RvciIsIHggPSAibnVtYmVyIG9mIG5vbi16ZXJvIGNvZWZmaWNpZW50cyIsIGNvbG9yPSIlIikrCiAgZ2dwbG90Mjo6dGhlbWUodGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTUpLCBheGlzLnRpdGxlLng9IGVsZW1lbnRfdGV4dChzaXplPTE1KSwgYXhpcy50aXRsZS55PSBlbGVtZW50X3RleHQoc2l6ZT0xNSkpCgpnMl9QbGFjZW50YV9JVFVfbiA8LQogIGNzdW1tYXJ5X1BsYWNlbnRhX0lUVV9uICU+JQogIGdncGxvdDI6OmdncGxvdCguKSArCiAgZ2dwbG90Mjo6dGhlbWVfYncoKSArCiAgZ2dwbG90Mjo6YWVzKHggPSBuemVybywgeSA9IG1lZGlhbl9jdm0pICsKICBnZ3Bsb3QyOjpnZW9tX3BvaW50KCkgKyBnZ3Bsb3QyOjpnZW9tX2xpbmUoKSsKICBnZ3Bsb3QyOjpsYWJzKHk9Im1lZGlhbiBjdm0iLCB4ID0gIm51bWJlciBvZiBub24temVybyBjb2VmZmljaWVudHMiKSsKICBnZ3Bsb3QyOjpzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzPTA6MTQsIGxhYmVscz0pKwogIGdncGxvdDI6OnRoZW1lKGF4aXMudGV4dD1lbGVtZW50X3RleHQoc2l6ZT0xNSksYXhpcy50aXRsZT1lbGVtZW50X3RleHQoc2l6ZT0xOCkpCgoKCmdyaWRFeHRyYTo6Z3JpZC5hcnJhbmdlKGcxX1BsYWNlbnRhX0lUVV9uLCBnMl9QbGFjZW50YV9JVFVfbiwgbmNvbCA9IDEpCmBgYAoKCmBgYHtyfQpwbmcoZmlsZW5hbWU9IlJlc3VsdHMvRmlndXJlcy9lbGFzdGljTmV0X3NpbmdsZVRpc3N1ZXMvT3V0Y29tZV9tYWluL2Jvb3RzdHJhcE1vZGVsc19QbGFjZW50YS5wbmciLCB3aWR0aD0yNDAwLCBoZWlnaHQ9MTgwMCwgcmVzPTMwMCkKZ3JpZEV4dHJhOjpncmlkLmFycmFuZ2UoZzFfUGxhY2VudGFfSVRVX24sIGcyX1BsYWNlbnRhX0lUVV9uLCBuY29sID0gMSkKZGV2Lm9mZigpCmBgYAoKYGBge3J9CnBuZyhmaWxlbmFtZT0iUmVzdWx0cy9GaWd1cmVzL2VsYXN0aWNOZXRfc2luZ2xlVGlzc3Vlcy9PdXRjb21lX21haW4vTW9kZWxfUGxhY2VudGEucG5nIiwgd2lkdGg9MjgwMCwgaGVpZ2h0PTE0MDAsIHJlcz00MDApCmcxX1BsYWNlbnRhX0lUVV9uCmRldi5vZmYoKQpgYGAKCgpgYGB7cn0KZWxib3dfZmluZGVyKGNzdW1tYXJ5X1BsYWNlbnRhX0lUVV9uJG56ZXJvLCBjc3VtbWFyeV9QbGFjZW50YV9JVFVfbiRtZWRpYW5fY3ZtKQoKbnplcm9faW5kaWNlc19QbGFjZW50YSA8LSBkYXRhLmZyYW1lKHQoZWxib3dfZmluZGVyKGNzdW1tYXJ5X1BsYWNlbnRhX0lUVV9uJG56ZXJvLCBjc3VtbWFyeV9QbGFjZW50YV9JVFVfbiRtZWRpYW5fY3ZtKSkpCmNvbG5hbWVzKG56ZXJvX2luZGljZXNfUGxhY2VudGEpIDwtIGMoIngiLCAieSIpCnJvd25hbWVzKG56ZXJvX2luZGljZXNfUGxhY2VudGEpIDwtIE5VTEwKYGBgCgoKYGBge3J9Cm56ZXJvX2ZpbmFsX3BsYWNlbnRhX2l0dSA8LSA3CmBgYAoKCmBgYHtyfQpzdW1tYXJ5X1BsYWNlbnRhX0lUVV9uX2ZpbmFsbnplcm8gPC0gY3N1bW1hcnlfUGxhY2VudGFfSVRVX25bbnplcm8gJWluJSBuemVyb19maW5hbF9wbGFjZW50YV9pdHVdCnNpZ192YXJfbmFtZXNfUGxhY2VudGFfSVRVX25fZmluYWxuemVybyA8LSBGaWx0ZXIoZnVuY3Rpb24oeCkgYW55KHggPiAwLjc1KSwgc3VtbWFyeV9QbGFjZW50YV9JVFVfbl9maW5hbG56ZXJvWywhYygibnplcm8iLCAibWVhbl9jdm0iLCAibWVkaWFuX2N2bSIpXSkgJT4lIGNvbG5hbWVzKCkKY29sbmFtZXMoc3VtbWFyeV9QbGFjZW50YV9JVFVfbl9maW5hbG56ZXJvKSA8LSBjKCJub24temVybyIsImNoaWxkIHNleCAoZmVtYWxlKSIsICJiaXJ0aCB3ZWlnaHQiLCAiYmlydGggbGVuZ3RoIiwgImhlYWQgY2lyY3VtZmVyZW5jZSIsICJkZWxpdmVyeSBtb2RlIChhaWRlZCkiLCAiaW5kdWNlZCBsYWJvciAoeWVzKSIsICJwYXJpdHkgKGJpcnRoIGJlZm9yZSkiLCAibWF0ZXJuYWwgYWdlIiwgIm1hdGVybmFsIEJNSSIsICJtYXRlcm5hbCBoeXBlcnRlbnNpb24gKHllcykiLCAibWF0ZXJuYWwgZGlhYmV0ZXMgKHllcykiLCAibWF0ZXJuYWwgbWVudGFsIGRpc29yZGVycyAoeWVzKSIsICJtYXRlcm5hbCBzbW9raW5nICh5ZXMpIiwgIm1lYW4gY3ZtIiwgIm1lZGlhbiBjdm0iKQpzdW1tYXJ5X1BsYWNlbnRhX0lUVV9uX2ZpbmFsbnplcm9UIDwtIGFzLmRhdGEuZnJhbWUodChzdW1tYXJ5X1BsYWNlbnRhX0lUVV9uX2ZpbmFsbnplcm9bLC1jKCJub24temVybyIsICJtZWRpYW4gY3ZtIiwgIm1lYW4gY3ZtIildKSkKc3VtbWFyeV9QbGFjZW50YV9JVFVfbl9maW5hbG56ZXJvVCR2YXJpYWJsZSA8LSByb3duYW1lcyhzdW1tYXJ5X1BsYWNlbnRhX0lUVV9uX2ZpbmFsbnplcm9UKQpyb3duYW1lcyhzdW1tYXJ5X1BsYWNlbnRhX0lUVV9uX2ZpbmFsbnplcm9UKSA8LSBOVUxMCm5hbWVzKHN1bW1hcnlfUGxhY2VudGFfSVRVX25fZmluYWxuemVyb1QpW25hbWVzKHN1bW1hcnlfUGxhY2VudGFfSVRVX25fZmluYWxuemVyb1QpID09ICdWMSddIDwtICdwZXJjZW50JwpzdW1tYXJ5X1BsYWNlbnRhX0lUVV9uX2ZpbmFsbnplcm9UIDwtIHN1bW1hcnlfUGxhY2VudGFfSVRVX25fZmluYWxuemVyb1Rbb3JkZXIoc3VtbWFyeV9QbGFjZW50YV9JVFVfbl9maW5hbG56ZXJvVCRwZXJjZW50KSxdCgpzdW1tYXJ5X1BsYWNlbnRhX0lUVV9uX2ZpbmFsbnplcm9UJG51bWJlciA8LSBzZXEoMSwgbGVuZ3RoKHN1bW1hcnlfUGxhY2VudGFfSVRVX25fZmluYWxuemVyb1QkdmFyaWFibGUpKQpgYGAKCmBgYHtyLCBmaWcud2lkdGg9OH0KcGVyY192YXJzX1BsYWNlbnRhX0lUVV9uIDwtIAogIGdncGxvdChzdW1tYXJ5X1BsYWNlbnRhX0lUVV9uX2ZpbmFsbnplcm9ULCBhZXMocmVvcmRlcih2YXJpYWJsZSwgcGVyY2VudCksIHBlcmNlbnQsIGdyb3VwPTEpKSsKICBnZW9tX3BvaW50KCkrIGdlb21fbGluZSgpKwogIHlsYWIoIiUgb2NjdXJlbmNlIGluIG1vZGVscyB3aXRoIG56ZXJvIGNvZWZmaWNpZW50cyA9IDQiKSsKICBzY2FsZV95X2NvbnRpbnVvdXMoYnJlYWtzPWMoMC4xLDAuMiwwLjMsMC40LDAuNSwwLjYsMC43LDAuOCwwLjkpKSsKICB4bGFiKCJ2YXJpYWJsZSIpKwogIGNvb3JkX2ZsaXAoKSsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQ9MC43NSwgbGluZXR5cGU9ImRvdHRlZCIpKwogIHRoZW1lX2J3KCkKCnBlcmNfdmFyc19QbGFjZW50YV9JVFVfbgoKIyBkZWNpZGUgZm9yIGN1dC1vZmYgJSAtPiBoZXJlIC43NQoKRmlsdGVyKGZ1bmN0aW9uKHgpIGFueSh4ID4gMC43NSksIHN1bW1hcnlfUGxhY2VudGFfSVRVX25fZmluYWxuemVyb1ssIWMoIm5vbi16ZXJvIiwgIm1lYW4gY3ZtIiwgIm1lZGlhbiBjdm0iKV0pCmBgYAoKCmBgYHtyfQpwbmcoZmlsZW5hbWU9IlJlc3VsdHMvRmlndXJlcy9lbGFzdGljTmV0X3NpbmdsZVRpc3N1ZXMvT3V0Y29tZV9tYWluL3ZhcnNQZXJjZW50X1BsYWNlbnRhLnBuZyIsIHdpZHRoPTE4MDAsIGhlaWdodD0xNDAwLCByZXM9MzAwKQpwZXJjX3ZhcnNfUGxhY2VudGFfSVRVX24KZGV2Lm9mZigpCmBgYApgYGB7cn0KcG0yX1BsYWNlbnRhX0lUVV9uX2NvZWYgPC0KICBkY2FzdChwbTJfUGxhY2VudGFfSVRVX25bLAogICAgICAgICAgICAgICAgICAgICAgICBhcy5saXN0KHVubGlzdCgKICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBwbHkoLlNELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbih4KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeSA8LSB1bm5hbWUocXVhbnRpbGUoeFt4ICE9IDBdLCBwcm9icyA9IGMoMC4wMjUsIDAuOTc1KSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdCgibm9uX3plcm8iID0gMTAwICogbWVhbih4ICE9IDApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGNsID0geVsxXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVjbCA9IHlbMl0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aCA9IGRpZmYoeSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYW4gPSBtZWRpYW4oeFt4IT0gMF0pKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSkpLAogICAgICAgICAgICAgICAgICAgICAgICAuU0Rjb2xzID0gYygiQ2hpbGRfU2V4ZmVtYWxlIiwgIkNoaWxkX0JpcnRoX1dlaWdodCIsICJDaGlsZF9CaXJ0aF9MZW5ndGgiLCAiQ2hpbGRfSGVhZF9DaXJjdW1mZXJlbmNlX0F0X0JpcnRoIiwgIkRlbGl2ZXJ5X21vZGVfZGljaG90b21haWRlZCIsICJJbmR1Y2VkX0xhYm91cnllcyIsICJQYXJpdHlfZGljaG90b21naXZlbiBiaXJ0aCBiZWZvcmUiLCAiTWF0ZXJuYWxfQWdlX1llYXJzIiwgIk1hdGVybmFsX0JvZHlfTWFzc19JbmRleF9pbl9FYXJseV9QcmVnbmFuY3kiLCAiTWF0ZXJuYWxfSHlwZXJ0ZW5zaW9uX2RpY2hvdG9taHlwZXJ0ZW5zaW9uIGluIGN1cnJlbnQgcHJlZ25hbmN5IiwgIk1hdGVybmFsX0RpYWJldGVzX2RpY2hvdG9tZGlhYmV0ZXMgaW4gY3VycmVudCBwcmVnbmFuY3kiLCAiTWF0ZXJuYWxfTWVudGFsX0Rpc29yZGVyc1llcyIsICJzbW9raW5nX2RpY2hvdG9teWVzIiksCiAgICAgICAgICAgICAgICAgICAgICAgIGJ5ID0gbnplcm9dW29yZGVyKG56ZXJvKV0gJT4lCiAgICAgICAgICBtZWx0KGlkLnZhciA9ICJuemVybyIpICU+JQogICAgICAgICAgLlssIG1ldHJpYyA6PSBzdWIoIl4uK1xcLiguKykkIiwgIlxcMSIsIHZhcmlhYmxlKV0gJT4lCiAgICAgICAgICAuWywgdmFyaWFibGUgOj0gc3ViKCJeKC4rKVxcLi4rJCIsICJcXDEiLCB2YXJpYWJsZSldICU+JQogICAgICAgICAgLltuemVybyA9PSBuemVyb19maW5hbF9wbGFjZW50YV9pdHVdLCBuemVybysgdmFyaWFibGUgfiBtZXRyaWMsIHZhbHVlLnZhcj0idmFsdWUiKQoKIyBnZXQgZGVzaXJlZCBvcmRlciBvZiBwcmVkaWN0b3JzCnBtMl9QbGFjZW50YV9JVFVfbl9jb2VmIDwtCiAgcG0yX1BsYWNlbnRhX0lUVV9uX2NvZWZbbWF0Y2goYygiQ2hpbGRfU2V4ZmVtYWxlIiwgIkNoaWxkX0JpcnRoX1dlaWdodCIsICJDaGlsZF9CaXJ0aF9MZW5ndGgiLCAiQ2hpbGRfSGVhZF9DaXJjdW1mZXJlbmNlX0F0X0JpcnRoIiwgIkRlbGl2ZXJ5X21vZGVfZGljaG90b21haWRlZCIsICJJbmR1Y2VkX0xhYm91cnllcyIsICJQYXJpdHlfZGljaG90b21naXZlbiBiaXJ0aCBiZWZvcmUiLCAiTWF0ZXJuYWxfQWdlX1llYXJzIiwgIk1hdGVybmFsX0JvZHlfTWFzc19JbmRleF9pbl9FYXJseV9QcmVnbmFuY3kiLCAiTWF0ZXJuYWxfSHlwZXJ0ZW5zaW9uX2RpY2hvdG9taHlwZXJ0ZW5zaW9uIGluIGN1cnJlbnQgcHJlZ25hbmN5IiwgIk1hdGVybmFsX0RpYWJldGVzX2RpY2hvdG9tZGlhYmV0ZXMgaW4gY3VycmVudCBwcmVnbmFuY3kiLCAiTWF0ZXJuYWxfTWVudGFsX0Rpc29yZGVyc1llcyIsICJzbW9raW5nX2RpY2hvdG9teWVzIiksIHBtMl9QbGFjZW50YV9JVFVfbl9jb2VmJHZhcmlhYmxlKSxdCnBtMl9QbGFjZW50YV9JVFVfbl9jb2VmJHZhcmlhYmxlIDwtIGZhY3RvcihwbTJfUGxhY2VudGFfSVRVX25fY29lZiR2YXJpYWJsLCBsZXZlbHM9dW5pcXVlKHBtMl9QbGFjZW50YV9JVFVfbl9jb2VmJHZhcmlhYmxlKSkKCmBgYAoKYGBge3J9CndyaXRlX3hsc3gocG0yX1BsYWNlbnRhX0lUVV9uX2NvZWYsIlJlc3VsdHMvVGFibGVzL0NvZWZmaWNpZW50c01vZGVsX1BsYWNlbnRhLnhsc3giKQpgYGAKCgpgYGB7cn0Kc2lnX3ZhcnNfUGxhY2VudGFfSVRVX24gPC0KICBwbTJfUGxhY2VudGFfSVRVX25fY29lZiAlPiUKICBnZ3Bsb3QyOjpnZ3Bsb3QoLikgKwogIGdncGxvdDI6OnRoZW1lX2J3KCkgKwogIGdncGxvdDI6OnRoZW1lKGF4aXMudGV4dC54PWVsZW1lbnRfYmxhbmsoKSkrCiAgZ2dwbG90Mjo6YWVzKHg9Im56ZXJvIikrCiAgZ2dwbG90Mjo6Z2VvbV9wb2ludChtYXBwaW5nID0gZ2dwbG90Mjo6YWVzKHkgPSB2YXJpYWJsZSwgc2l6ZSA9bm9uX3plcm8sIGFscGhhID0gbm9uX3plcm8sIGNvbG9yID0gbm9uX3plcm8pKSArCiAgZ2dwbG90Mjo6Z2VvbV90ZXh0KGFlcyh5PXZhcmlhYmxlLCBsYWJlbD1zcHJpbnRmKCIlMC4yZiIsIHJvdW5kKG1lZGlhbiwgZGlnaXRzPTIpKSwgc2l6ZT01MCksaGp1c3Q9MCwgdmp1c3Q9MC41LCBudWRnZV94ID0gMC4xKSsKICBnZ3Bsb3QyOjpzY2FsZV9jb2xvcl9ncmFkaWVudDIoaGlnaCA9ICdncmVlbicsIG1pZCA9ICJwdXJwbGUiLCBsb3cgPSAiYmxhY2siLCBtaWRwb2ludCA9NTApKwogIGdncGxvdDI6OnNjYWxlX2FscGhhKGd1aWRlID0gJ25vbmUnKSsKICBnZ3Bsb3QyOjpzY2FsZV9zaXplKGd1aWRlID0gJ25vbmUnKSsKICBnZ3Bsb3QyOjpzY2FsZV95X2Rpc2NyZXRlKGxhYmVscz0gYygiY2hpbGQgc2V4IChmZW1hbGUpIiwgImJpcnRoIHdlaWdodCIsICJiaXJ0aCBsZW5ndGgiLCAiaGVhZCBjaXJjdW1mZXJlbmNlIiwgImRlbGl2ZXJ5IG1vZGUgKGFpZGVkKSIsICJpbmR1Y2VkIGxhYm9yICh5ZXMpIiwgInBhcml0eSAoYmlydGggYmVmb3JlKSIsICJtYXRlcm5hbCBhZ2UiLCAibWF0ZXJuYWwgQk1JIiwgIm1hdGVybmFsIGh5cGVydGVuc2lvbiAoeWVzKSIsICJtYXRlcm5hbCBkaWFiZXRlcyAoeWVzKSIsICJtYXRlcm5hbCBtZW50YWwgZGlzb3JkZXJzICh5ZXMpIiwgIm1hdGVybmFsIHNtb2tpbmcgKHllcykiLCAibWF0ZXJuYWwgYWxjb2hvbCB1c2UgKHllcykiKSkrCiAgZ2dwbG90Mjo6bGFicyh5PSJwcmVkaWN0b3IiLCB4ID0gIm51bWJlciBvZiBub24temVybyBjb2VmZmljaWVudHMgPSA3IiwgY29sb3I9IiUiKQoKYGBgCgpgYGB7cn0KY29lZl9QbGFjZW50YV9JVFVfbiA8LSAKICBnZ3Bsb3QocG0yX1BsYWNlbnRhX0lUVV9uX2NvZWYsIGFlcyh5ID0gdmFyaWFibGUsIHg9bWVkaWFuKSkrCiAgZ2VvbV9wb2ludChtYXBwaW5nID0gZ2dwbG90Mjo6YWVzKHkgPSB2YXJpYWJsZSwgc2l6ZSA9bm9uX3plcm8sIGFscGhhID0gbm9uX3plcm8sIGNvbG9yID0gbm9uX3plcm8pKSsKICBzY2FsZV9jb2xvcl9ncmFkaWVudDIoaGlnaCA9ICdncmVlbicsIG1pZCA9ICJwdXJwbGUiLCBsb3cgPSAiYmxhY2siLCBtaWRwb2ludCA9NTAsIGxpbWl0cz1jKDAsMTAwKSkrCiAgc2NhbGVfYWxwaGEoZ3VpZGUgPSAnbm9uZScpKwogIHNjYWxlX3NpemUoZ3VpZGUgPSAnbm9uZScpKwogIGdlb21fcG9pbnQoKSsKICBnZW9tX2Vycm9yYmFyKGFlcyh5ID0gdmFyaWFibGUsIHhtaW4gPSBsY2wsIHhtYXggPSB1Y2wpLCB3aWR0aCA9IDAuMikrCiAgbGFicyh5PSJwcmVkaWN0b3IiLCB4ID0gIlxubWVkaWFuICYgOTUlIENJIG9mIGNvZWZmaWNpZW50IChvdmVyIGJvb3RzdHJhcHMpIiwgY29sb3I9IiUiKSsKICBzY2FsZV94X2NvbnRpbnVvdXMobGltaXRzPWMoLTAuNCwwLjQpLCBicmVha3M9YygtLjQsLS4zLC0uMiwgLS4xLCAwLCAuMSwgLjIsIC4zLCAuNCkpKwogIHNjYWxlX3lfZGlzY3JldGUobGFiZWxzPSBjKCJjaGlsZCBzZXggKGZlbWFsZSkiLCAiYmlydGggd2VpZ2h0IiwgImJpcnRoIGxlbmd0aCIsICJoZWFkIGNpcmN1bWZlcmVuY2UiLCAiZGVsaXZlcnkgbW9kZSAoYWlkZWQpIiwgImluZHVjZWQgbGFib3IgKHllcykiLCAicGFyaXR5IChiaXJ0aCBiZWZvcmUpIiwgIm1hdGVybmFsIGFnZSIsICJtYXRlcm5hbCBCTUkiLCAibWF0ZXJuYWwgaHlwZXJ0ZW5zaW9uICh5ZXMpIiwgIm1hdGVybmFsIGRpYWJldGVzICh5ZXMpIiwgIm1hdGVybmFsIG1lbnRhbCBkaXNvcmRlcnMgKHllcykiLCAibWF0ZXJuYWwgc21va2luZyAoeWVzKSIsICJtYXRlcm5hbCBhbGNvaG9sIHVzZSAoeWVzKSIpKSsKICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQ9MCwgbGluZXR5cGU9ImRhc2hlZCIpKwogIHRoZW1lX2J3KCkrCiAgdGhlbWUodGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTUpLCBheGlzLnRpdGxlLng9IGVsZW1lbnRfdGV4dChzaXplPTE1KSwgYXhpcy50aXRsZS55PSBlbGVtZW50X3RleHQoc2l6ZT0xNSkpCgoKY29lZl9QbGFjZW50YV9JVFVfbiAKYGBgCgoKYGBge3J9CnBuZyhmaWxlbmFtZT0iUmVzdWx0cy9GaWd1cmVzL2VsYXN0aWNOZXRfc2luZ2xlVGlzc3Vlcy9PdXRjb21lX21haW4vY29lZl9QbGFjZW50YS5wbmciLCB3aWR0aD0yODAwLCBoZWlnaHQ9MTQwMCwgcmVzPTQwMCkKY29lZl9QbGFjZW50YV9JVFVfbgpkZXYub2ZmKCkKYGBgCgpgYGB7cn0KcDEgPC0KICBjc3VtbWFyeV9QbGFjZW50YV9JVFVfbiAlPiUKICBtZWx0KGlkLnZhcnMgPSBjKCJuemVybyIsICJtZWFuX2N2bSIsICJtZWRpYW5fY3ZtIikpICU+JQogIGdncGxvdDI6OmdncGxvdCguKSArCiAgZ2dwbG90Mjo6dGhlbWVfYncoKSArCiAgZ2dwbG90Mjo6YWVzKHggPSBuemVybykgKwogIGdncGxvdDI6Omdlb21fcG9pbnQobWFwcGluZyA9IGdncGxvdDI6OmFlcyh5ID0gdmFyaWFibGUsIHNpemUgPSB2YWx1ZSwgYWxwaGEgPSB2YWx1ZSwgY29sb3IgPSB2YWx1ZSoxMDApKSArCiAgZ2dwbG90Mjo6c2NhbGVfY29sb3JfZ3JhZGllbnQyKGhpZ2ggPSAnZ3JlZW4nLCBtaWQgPSAicHVycGxlIiwgbG93ID0gImJsYWNrIiwgbWlkcG9pbnQgPTUwKSsKICBnZ3Bsb3QyOjpzY2FsZV9hbHBoYShndWlkZSA9ICdub25lJykrCiAgZ2dwbG90Mjo6c2NhbGVfc2l6ZShndWlkZSA9ICdub25lJykrCiAgZ2dwbG90Mjo6c2NhbGVfeV9kaXNjcmV0ZShsYWJlbHM9IGMoImNoaWxkIHNleCAoZmVtYWxlKSIsICJiaXJ0aCB3ZWlnaHQiLCAiYmlydGggbGVuZ3RoIiwgImhlYWQgY2lyY3VtZmVyZW5jZSIsICJkZWxpdmVyeSBtb2RlIChhaWRlZCkiLCAiaW5kdWNlZCBsYWJvciAoeWVzKSIsICJwYXJpdHkgKGJpcnRoIGJlZm9yZSkiLCAibWF0ZXJuYWwgYWdlIiwgIm1hdGVybmFsIEJNSSIsICJtYXRlcm5hbCBoeXBlcnRlbnNpb24gKHllcykiLCAibWF0ZXJuYWwgZGlhYmV0ZXMgKHllcykiLCAibWF0ZXJuYWwgbWVudGFsIGRpc29yZGVycyAoeWVzKSIsICJtYXRlcm5hbCBzbW9raW5nICh5ZXMpIiwgIm1hdGVybmFsIGFsY29ob2wgdXNlICh5ZXMpIikpKwogIGdncGxvdDI6OnNjYWxlX3hfY29udGludW91cyhicmVha3M9MDoxNCwgbGFiZWxzPSkrCiAgZ2dwbG90Mjo6bGFicyh5PSJwcmVkaWN0b3IiLCB4ID0gIlxubnVtYmVyIG9mIG5vbi16ZXJvIGNvZWZmaWNpZW50cyIsIGNvbG9yPSIlIikrCiAgZ2dwbG90Mjo6dGhlbWUodGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0xNyksIGF4aXMudGl0bGUueD0gZWxlbWVudF90ZXh0KHNpemU9MTUpLCBheGlzLnRpdGxlLnk9IGVsZW1lbnRfdGV4dChzaXplPTE1KSwgbGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKQogIApwMiA8LSAKICBnZ3Bsb3QocG0yX1BsYWNlbnRhX0lUVV9uX2NvZWYsIGFlcyh5ID0gdmFyaWFibGUsIHg9bWVkaWFuKSkrCiAgZ2VvbV9wb2ludChtYXBwaW5nID0gZ2dwbG90Mjo6YWVzKHkgPSB2YXJpYWJsZSwgc2l6ZSA9bm9uX3plcm8sIGFscGhhID0gbm9uX3plcm8sIGNvbG9yID0gbm9uX3plcm8pKSsKICBzY2FsZV9jb2xvcl9ncmFkaWVudDIoaGlnaCA9ICdncmVlbicsIG1pZCA9ICJwdXJwbGUiLCBsb3cgPSAiYmxhY2siLCBtaWRwb2ludCA9NTAsIGxpbWl0cz1jKDAsMTAwKSkrCiAgc2NhbGVfYWxwaGEoZ3VpZGUgPSAnbm9uZScpKwogIHNjYWxlX3NpemUoZ3VpZGUgPSAnbm9uZScpKwogIGdlb21fcG9pbnQoKSsKICBnZW9tX2Vycm9yYmFyKGFlcyh5ID0gdmFyaWFibGUsIHhtaW4gPSBsY2wsIHhtYXggPSB1Y2wpLCB3aWR0aCA9IDAuMikrCiAgbGFicyh5PSIiLCB4ID0gIlxubWVkaWFuICYgOTUlIENJIG9mIGNvZWZmaWNpZW50IChvdmVyIGJvb3RzdHJhcHMpIiwgY29sb3I9IiUiKSsKICBzY2FsZV94X2NvbnRpbnVvdXMobGltaXRzPWMoLTAuNCwwLjQpLCBicmVha3M9YygtLjQsLS4zLC0uMiwgLS4xLCAwLCAuMSwgLjIsIC4zLCAuNCkpKwogIHNjYWxlX3lfZGlzY3JldGUobGFiZWxzPSBjKCJjaGlsZCBzZXggKGZlbWFsZSkiLCAiYmlydGggd2VpZ2h0IiwgImJpcnRoIGxlbmd0aCIsICJoZWFkIGNpcmN1bWZlcmVuY2UiLCAiZGVsaXZlcnkgbW9kZSAoYWlkZWQpIiwgImluZHVjZWQgbGFib3IgKHllcykiLCAicGFyaXR5IChiaXJ0aCBiZWZvcmUpIiwgIm1hdGVybmFsIGFnZSIsICJtYXRlcm5hbCBCTUkiLCAibWF0ZXJuYWwgaHlwZXJ0ZW5zaW9uICh5ZXMpIiwgIm1hdGVybmFsIGRpYWJldGVzICh5ZXMpIiwgIm1hdGVybmFsIG1lbnRhbCBkaXNvcmRlcnMgKHllcykiLCAibWF0ZXJuYWwgc21va2luZyAoeWVzKSIsICJtYXRlcm5hbCBhbGNvaG9sIHVzZSAoeWVzKSIpKSsKICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQ9MCwgbGluZXR5cGU9ImRhc2hlZCIpKwogIHRoZW1lX2J3KCkrCiAgZ2d0aXRsZSgibnplcm8gPSA3IikrCiAgdGhlbWUodGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTcpLCBheGlzLnRpdGxlLng9IGVsZW1lbnRfdGV4dChzaXplPTE1KSwgYXhpcy50aXRsZS55PSBlbGVtZW50X3RleHQoc2l6ZT0xNSksIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZT0xNSksIGF4aXMudGV4dC55PWVsZW1lbnRfYmxhbmsoKSkKCmcxIDwtIGdncGxvdEdyb2IocDEpCmcyIDwtIGdncGxvdEdyb2IocDIpCmcgPC0gY2JpbmQoZzEsIGcyLCBzaXplID0gImxhc3QiKQpnJGhlaWdodHMgPC0gdW5pdC5wbWF4KGcxJGhlaWdodHMsIGcyJGhlaWdodHMpCgpwbmcoZmlsZW5hbWU9IlJlc3VsdHMvRmlndXJlcy9lbGFzdGljTmV0X3NpbmdsZVRpc3N1ZXMvT3V0Y29tZV9tYWluL01vZGVsX2NvZWZfUGxhY2VudGEucG5nIiwgd2lkdGg9NTgwMCwgaGVpZ2h0PTE2MDAsIHJlcz00MDApCmdyaWQuZHJhdyhnKQpkZXYub2ZmKCkKYGBgCgpbdG8gdGhlIHRvcF0oI3RvcCkgCgojIyBQbGFjZW50YSBlbGFzdGljIG5ldCB7I2VsYXN0aWNuZXRQbGFjZW50YUlUVV9hfSAgCmFkZGl0aW9uYWwgbW9kZWwsIHdpdGggYWxjb2hvbCB2YXJpYWJsZQoKYGBge3J9CiMgaW4gY2FzZSB5b3Ugd2FudCB0byBzdGFydCBmcm9tIGhlcmUKbG9hZCgiSW5wdXREYXRhL0Nsb2NrQ2FsY3VsYXRpb25zSW5wdXQvUmVnX0lucHV0X0RhdGFfUGxhY2VudGFfSVRVX0VBQVJfbm9OYV93YS5SZGF0YSIpCmBgYAoKCmBgYHtyfQp5cmNfbWF0X0lUVV9QbGFjZW50YV93YSA8LSBtYXRyaXgoUmVnX0lucHV0X0RhdGFfUGxhY2VudGFfSVRVX0VBQVJfbm9OYV93YSRFQUFSX0xlZSkKeHJjX21hdF9JVFVfUGxhY2VudGFfd2EgPC0gbW9kZWwubWF0cml4KCB+IC4gLSBFQUFSX0xlZSwgZGF0YSA9IFJlZ19JbnB1dF9EYXRhX1BsYWNlbnRhX0lUVV9FQUFSX25vTmFfd2EpWywgLTFdCnlyY19tYXRfSVRVX3NjYWxlZF9QbGFjZW50YV93YSA8LSBzY2FsZSh5cmNfbWF0X0lUVV9QbGFjZW50YV93YSkKeHJjX21hdF9JVFVfc2NhbGVkX1BsYWNlbnRhX3dhIDwtIHNjYWxlKHhyY19tYXRfSVRVX1BsYWNlbnRhX3dhKQpgYGAKCjwhLS0gc2V0IHNlZWQgLS0+CjwhLS0gYGBge3J9IC0tPgo8IS0tIHNldC5zZWVkKDIwMjApIC0tPgo8IS0tIGBgYCAtLT4KCgo8IS0tIGBgYHtyLCB3YXJuaW5nPUZ9IC0tPgo8IS0tICAgbmJvb3QgPSAxMDAwIC0tPgoKPCEtLSAgIHN0YXJ0X3RpbWUgPC0gU3lzLnRpbWUoKSAtLT4KPCEtLSAgIGJvb3RzdHJhcHNfUGxhY2VudGFfSVRVX3dhIDwtIHJlcGxpY2F0ZShuYm9vdCwgeyAtLT4KPCEtLSAgICAgcndzIDwtIHNhbXBsZSgxOm5yb3coeHJjX21hdF9JVFVfc2NhbGVkX1BsYWNlbnRhX3dhKSwgcmVwbGFjZSA9IFRSVUUpIC0tPgo8IS0tICAgICBlbnNyKHhyY19tYXRfSVRVX3NjYWxlZF9QbGFjZW50YV93YVtyd3MsIF0sIHlyY19tYXRfSVRVX3NjYWxlZF9QbGFjZW50YV93YVtyd3MsIF0sIHN0YW5kYXJkaXplZCA9IEZBTFNFLCBmYW1pbHk9ImdhdXNzaWFuIiwgbmxhbWJkYT0xMDAsIG5mb2xkcz0xMCwgYWxwaGE9YygwLjAsMC4xLDAuMiwwLjMsMC40LDAuNSwwLjYsMC43LDAuOCwwLjksMS4wKSkgLS0+CjwhLS0gICB9LCAtLT4KPCEtLSAgIHNpbXBsaWZ5ID0gRkFMU0UpIC0tPgoKPCEtLSAgIGVuZF90aW1lIDwtIFN5cy50aW1lKCkgLS0+CjwhLS0gICBlbmRfdGltZSAtIHN0YXJ0X3RpbWUgLS0+Cgo8IS0tICAgI1RpbWUgZGlmZmVyZW5jZSBvZiAzLjE1OTMxOSBob3VycyAtLT4KCjwhLS0gYGBgIC0tPgoKPCEtLSBgYGB7cn0gLS0+CjwhLS0gc2F2ZShib290c3RyYXBzX1BsYWNlbnRhX0lUVV93YSwgZmlsZT0iSW5wdXREYXRhL0RhdGFfRWxhc3RpY05ldHMvYm9vdHN0cmFwc19QbGFjZW50YV9JVFVfd2FfMTAwMC5SZGF0YSIpIC0tPgo8IS0tIGBgYCAtLT4KCgoKYGBge3J9CmxvYWQoIklucHV0RGF0YS9EYXRhX0VsYXN0aWNOZXRzL2Jvb3RzdHJhcHNfUGxhY2VudGFfSVRVX3dhXzEwMDAuUmRhdGEiKQpgYGAKCgpgYGB7cn0Kc3VtbWFyaWVzX1BsYWNlbnRhX0lUVV93YSA8LQogIGJvb3RzdHJhcHNfUGxhY2VudGFfSVRVX3dhICU+JQogIGxhcHBseShzdW1tYXJ5KSAlPiUKICByYmluZGxpc3QoaWRjb2wgPSAiYm9vdHN0cmFwIikKCnN1bW1hcmllc19QbGFjZW50YV9JVFVfd2EKYGBgCgoKYGBge3J9CnN1bW1hcmllc19QbGFjZW50YV9JVFVfd2FbLCAuU0RbY3ZtID09IG1pbihjdm0pXSwgYnkgPSBjKCJib290c3RyYXAiLCAibnplcm8iKV0gJT4lCiAgZ2dwbG90Mjo6Z2dwbG90KGRhdGEgPSAuKSArCiAgZ2dwbG90Mjo6YWVzKHggPSBuemVybywgeSA9IGN2bSwgZ3JvdXAgPSBib290c3RyYXApICsKICBnZ3Bsb3QyOjpnZW9tX3BvaW50KCkgKwogIGdncGxvdDI6Omdlb21fbGluZSgpCmBgYAoKCmBgYHtyfQpwbmcoZmlsZW5hbWU9IlJlc3VsdHMvRmlndXJlcy9lbGFzdGljTmV0X3NpbmdsZVRpc3N1ZXMvT3V0Y29tZV9hZGQvYWxjb2hvbC9ib290c3RyYXBzX1BsYWNlbnRhLnBuZyIsIHdpZHRoPTgwMCwgaGVpZ2h0PTYwMCkKc3VtbWFyaWVzX1BsYWNlbnRhX0lUVV93YVssIC5TRFtjdm0gPT0gbWluKGN2bSldLCBieSA9IGMoImJvb3RzdHJhcCIsICJuemVybyIpXSAlPiUKICBnZ3Bsb3QyOjpnZ3Bsb3QoZGF0YSA9IC4pICsKICBnZ3Bsb3QyOjphZXMoeCA9IG56ZXJvLCB5ID0gY3ZtLCBncm91cCA9IGJvb3RzdHJhcCkgKwogIGdncGxvdDI6Omdlb21fcG9pbnQoKSArCiAgZ2dwbG90Mjo6Z2VvbV9saW5lKCkKZGV2Lm9mZigpCmBgYAoKCjwhLS0gYGBge3IsIHdhcm5pbmc9RkFMU0V9IC0tPgo8IS0tICMgbG93ZXN0IGN2bSBieSBib290c3RyYXAgYW5kIG56ZXJvIC0tPgo8IS0tIHBtX1BsYWNlbnRhX0lUVV93YSA8LSBzdW1tYXJpZXNfUGxhY2VudGFfSVRVX3dhWywgLlNEW2N2bSA9PSBtaW4oY3ZtKV0sIGJ5ID0gYygiYm9vdHN0cmFwIiwgIm56ZXJvIildIC0tPgo8IS0tIHBtMl9QbGFjZW50YV9JVFVfd2EgPC0gTlVMTCAtLT4KCjwhLS0gZm9yKGkgaW4gYXMuaW50ZWdlcihzZXEoMSwgbnJvdyhwbV9QbGFjZW50YV9JVFVfd2EpLCBieSA9IDEpKSkgeyAtLT4KPCEtLSAgIHBtMl9QbGFjZW50YV9JVFVfd2EgPC0gcmJpbmQocG0yX1BsYWNlbnRhX0lUVV93YSwgLS0+CjwhLS0gICAgICAgICAgICAgICAgY2JpbmQocG1fUGxhY2VudGFfSVRVX3dhW2ksIF0sIC0tPgo8IS0tICAgICAgICAgICAgICAgIHQoYXMubWF0cml4KGNvZWYoYm9vdHN0cmFwc19QbGFjZW50YV9JVFVfd2FbW3BtX1BsYWNlbnRhX0lUVV93YVtpLCBib290c3RyYXBdXV1bW3BtX1BsYWNlbnRhX0lUVV93YVtpLCBsX2luZGV4XV1dLCBzID0gcG1fUGxhY2VudGFfSVRVX3dhW2ksIGxhbWJkYV0pKSkgLS0+CjwhLS0gICAgICAgICAgICAgICAgKSAtLT4KPCEtLSAgICkgLS0+CjwhLS0gfSAtLT4KCjwhLS0gcG0yX1BsYWNlbnRhX0lUVV93YSAtLT4KPCEtLSBgYGAgLS0+CgoKPCEtLSBgYGB7cn0gLS0+CjwhLS0gIyBzYXZlICJwcmVmZXJhYmxlIG1vZGVscyIgLS0+CjwhLS0gc2F2ZShwbTJfUGxhY2VudGFfSVRVX3dhLCBmaWxlPSJJbnB1dERhdGEvRGF0YV9FbGFzdGljTmV0cy9wbTJfUGxhY2VudGFfSVRVX3dhLlJkYXRhIikgLS0+CjwhLS0gYGBgIC0tPgoKCmBgYHtyfQpsb2FkKCJJbnB1dERhdGEvRGF0YV9FbGFzdGljTmV0cy9wbTJfUGxhY2VudGFfSVRVX3dhLlJkYXRhIikKIyBjb2VmZmljaWVudCB2YWx1ZXMgZm9yIHRoZSBtb2RlbHMgd2l0aCBzbWFsbGVzdCBjdm0gYnkgbnVtYmVyIG9mIG5vbi1lcnpvIGNvZWZmaWNpZW50cyBhbmQgYm9vdHN0cmFwCmBgYAoKCmBgYHtyfQpjc3VtbWFyeV9QbGFjZW50YV9JVFVfd2EgPC0gUmVkdWNlKGZ1bmN0aW9uKHgseSkgbWVyZ2UoeCA9IHgsIHkgPSB5LCBieSA9ICJuemVybyIpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3QocG0yX1BsYWNlbnRhX0lUVV93YVssIGxhcHBseSguU0QsIGZ1bmN0aW9uKHgpIHttZWFuKHggIT0gMCl9KSwgLlNEY29scyA9IGMoIkNoaWxkX1NleGZlbWFsZSIsICJDaGlsZF9CaXJ0aF9XZWlnaHQiLCAiQ2hpbGRfQmlydGhfTGVuZ3RoIiwgIkNoaWxkX0hlYWRfQ2lyY3VtZmVyZW5jZV9BdF9CaXJ0aCIsICJEZWxpdmVyeV9tb2RlX2RpY2hvdG9tYWlkZWQiLCAiSW5kdWNlZF9MYWJvdXJ5ZXMiLCAiUGFyaXR5X2RpY2hvdG9tZ2l2ZW4gYmlydGggYmVmb3JlIiwgIk1hdGVybmFsX0FnZV9ZZWFycyIsICJNYXRlcm5hbF9Cb2R5X01hc3NfSW5kZXhfaW5fRWFybHlfUHJlZ25hbmN5IiwgIk1hdGVybmFsX0h5cGVydGVuc2lvbl9kaWNob3RvbWh5cGVydGVuc2lvbiBpbiBjdXJyZW50IHByZWduYW5jeSIsICJNYXRlcm5hbF9EaWFiZXRlc19kaWNob3RvbWRpYWJldGVzIGluIGN1cnJlbnQgcHJlZ25hbmN5IiwgIk1hdGVybmFsX01lbnRhbF9EaXNvcmRlcnNZZXMiLCAic21va2luZ19kaWNob3RvbXllcyIsICJtYXRlcm5hbF9hbGNvaG9sX3VzZXllcyIpLCBieSA9IG56ZXJvXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBtMl9QbGFjZW50YV9JVFVfd2FbLCAuKG1lYW5fY3ZtID0gbWVhbihjdm0pKSwgYnkgPSBuemVyb10sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBtMl9QbGFjZW50YV9JVFVfd2FbLCAuKG1lZGlhbl9jdm0gPSBtZWRpYW4oY3ZtKSksIGJ5ID0gbnplcm9dCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApKVtvcmRlcihuemVybyldCgpjc3VtbWFyeV9QbGFjZW50YV9JVFVfd2EKYGBgCgoKYGBge3J9CmcxX1BsYWNlbnRhX0lUVV93YSA8LQogIGNzdW1tYXJ5X1BsYWNlbnRhX0lUVV93YSAlPiUKICBtZWx0KGlkLnZhcnMgPSBjKCJuemVybyIsICJtZWFuX2N2bSIsICJtZWRpYW5fY3ZtIikpICU+JQogIGdncGxvdDI6OmdncGxvdCguKSArCiAgZ2dwbG90Mjo6dGhlbWVfYncoKSArCiAgZ2dwbG90Mjo6YWVzKHggPSBuemVybykgKwogIGdncGxvdDI6Omdlb21fcG9pbnQobWFwcGluZyA9IGdncGxvdDI6OmFlcyh5ID0gdmFyaWFibGUsIHNpemUgPSB2YWx1ZSwgYWxwaGEgPSB2YWx1ZSwgY29sb3IgPSB2YWx1ZSoxMDApKSArCiAgZ2dwbG90Mjo6c2NhbGVfY29sb3JfZ3JhZGllbnQyKGhpZ2ggPSAnZ3JlZW4nLCBtaWQgPSAicHVycGxlIiwgbG93ID0gImJsYWNrIiwgbWlkcG9pbnQgPTUwKSsKICBnZ3Bsb3QyOjpzY2FsZV9hbHBoYShndWlkZSA9ICdub25lJykrCiAgZ2dwbG90Mjo6c2NhbGVfc2l6ZShndWlkZSA9ICdub25lJykrCiAgZ2dwbG90Mjo6c2NhbGVfeV9kaXNjcmV0ZShsYWJlbHM9IGMoImNoaWxkIHNleCIsICJiaXJ0aCB3ZWlnaHQiLCAiYmlydGggbGVuZ3RoIiwgImhlYWQgY2lyY3VtZmVyZW5jZSIsICJkZWxpdmVyeSBtb2RlIiwgImluZHVjZWQgbGFib3IiLCAicGFyaXR5IiwgIm1hdGVybmFsIGFnZSIsICJtYXRlcm5hbCBCTUkiLCAibWF0ZXJuYWwgaHlwZXJ0ZW5zaW9uIiwgIm1hdGVybmFsIGRpYWJldGVzIiwgIm1hdGVybmFsIG1lbnRhbCBkaXNvcmRlcnMiLCAibWF0ZXJuYWwgc21va2luZyIsICJtYXRlcm5hbCBhbGNvaG9sIHVzZSIpKSsKICBnZ3Bsb3QyOjpzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzPTA6MTQsIGxhYmVscz0pKwogIGdncGxvdDI6OmxhYnMoeT0icHJlZGljdG9yIiwgeCA9ICJudW1iZXIgb2Ygbm9uLXplcm8gY29lZmZpY2llbnRzIiwgY29sb3I9IiUiKSsKICBnZ3Bsb3QyOjp0aGVtZSh0ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNSksIGF4aXMudGl0bGUueD0gZWxlbWVudF90ZXh0KHNpemU9MTUpLCBheGlzLnRpdGxlLnk9IGVsZW1lbnRfdGV4dChzaXplPTE1KSkKCmcyX1BsYWNlbnRhX0lUVV93YSA8LQogIGNzdW1tYXJ5X1BsYWNlbnRhX0lUVV93YSAlPiUKICBnZ3Bsb3QyOjpnZ3Bsb3QoLikgKwogIGdncGxvdDI6OnRoZW1lX2J3KCkgKwogIGdncGxvdDI6OmFlcyh4ID0gbnplcm8sIHkgPSBtZWRpYW5fY3ZtKSArCiAgZ2dwbG90Mjo6Z2VvbV9wb2ludCgpICsgZ2dwbG90Mjo6Z2VvbV9saW5lKCkrCiAgZ2dwbG90Mjo6bGFicyh5PSJtZWRpYW4gY3ZtIiwgeCA9ICJudW1iZXIgb2Ygbm9uLXplcm8gY29lZmZpY2llbnRzIikrCiAgZ2dwbG90Mjo6c2NhbGVfeF9jb250aW51b3VzKGJyZWFrcz0wOjE0LCBsYWJlbHM9KSsKICBnZ3Bsb3QyOjp0aGVtZShheGlzLnRleHQ9ZWxlbWVudF90ZXh0KHNpemU9MTUpLGF4aXMudGl0bGU9ZWxlbWVudF90ZXh0KHNpemU9MTgpKQoKZ3JpZEV4dHJhOjpncmlkLmFycmFuZ2UoZzFfUGxhY2VudGFfSVRVX3dhLCBnMl9QbGFjZW50YV9JVFVfd2EsIG5jb2wgPSAxKQoKYGBgCgoKYGBge3J9CnBuZyhmaWxlbmFtZT0iUmVzdWx0cy9GaWd1cmVzL2VsYXN0aWNOZXRfc2luZ2xlVGlzc3Vlcy9PdXRjb21lX2FkZC9hbGNvaG9sL2Jvb3RzdHJhcE1vZGVsc19QbGFjZW50YS5wbmciLCB3aWR0aD0yNDAwLCBoZWlnaHQ9MTgwMCwgcmVzPTMwMCkKZ3JpZEV4dHJhOjpncmlkLmFycmFuZ2UoZzFfUGxhY2VudGFfSVRVX3dhLCBnMl9QbGFjZW50YV9JVFVfd2EsIG5jb2wgPSAxKQpkZXYub2ZmKCkKYGBgCgpgYGB7cn0KcG5nKGZpbGVuYW1lPSJSZXN1bHRzL0ZpZ3VyZXMvZWxhc3RpY05ldF9zaW5nbGVUaXNzdWVzL091dGNvbWVfYWRkL2FsY29ob2wvTW9kZWxfUGxhY2VudGEucG5nIiwgd2lkdGg9MjgwMCwgaGVpZ2h0PTE0MDAsIHJlcz00MDApCmcxX1BsYWNlbnRhX0lUVV93YQpkZXYub2ZmKCkKYGBgCgoKYGBge3J9CmVsYm93X2ZpbmRlcihjc3VtbWFyeV9QbGFjZW50YV9JVFVfd2Ekbnplcm8sIGNzdW1tYXJ5X1BsYWNlbnRhX0lUVV93YSRtZWRpYW5fY3ZtKQoKbnplcm9faW5kaWNlc19QbGFjZW50YSA8LSBkYXRhLmZyYW1lKHQoZWxib3dfZmluZGVyKGNzdW1tYXJ5X1BsYWNlbnRhX0lUVV93YSRuemVybywgY3N1bW1hcnlfUGxhY2VudGFfSVRVX3dhJG1lZGlhbl9jdm0pKSkKY29sbmFtZXMobnplcm9faW5kaWNlc19QbGFjZW50YSkgPC0gYygieCIsICJ5IikKcm93bmFtZXMobnplcm9faW5kaWNlc19QbGFjZW50YSkgPC0gTlVMTApgYGAKCmBgYHtyfQpuemVyb19maW5hbF9pdHVfcGxhY2VudGFfd2EgPC0gNgpgYGAKCmBgYHtyfQpjc3VtbWFyeV9QbGFjZW50YV9JVFVfd2Fbbnplcm8gJWluJSBuemVyb19maW5hbF9pdHVfcGxhY2VudGFfd2FdCmBgYAoKCmBgYHtyfQpub256ZXJvX2Nob29zZV9QbGFjZW50YSA8LSBnZ3Bsb3QyOjpnZ3Bsb3QoY3N1bW1hcnlfUGxhY2VudGFfSVRVX3dhKSArCiAgZ2dwbG90Mjo6dGhlbWVfYncoKSsKICBnZ3Bsb3QyOjphZXMoeCA9IG56ZXJvLCB5ID0gbWVkaWFuX2N2bSkgKwogIGdncGxvdDI6OnNjYWxlX3hfY29udGludW91cyhicmVha3M9YygwOjE3KSkrCiAgZ2dwbG90Mjo6Z2VvbV9wb2ludCgpICsgZ2dwbG90Mjo6Z2VvbV9saW5lKCkrCiAgZ2dwbG90Mjo6Z2VvbV9wb2ludChkYXRhPW56ZXJvX2luZGljZXNfUGxhY2VudGEsIGFlcyh4PXgsIHk9eSksIGNvbG91cj0icmVkIiwgc2l6ZT0yKSsKICBnZ3Bsb3QyOjp5bGFiKCJtZWRpYW4gb2YgbWluaW11bSBjcm9zcy12YWxpZGF0aW9uIGVycm9ycyBvdmVyIGJvb3RzdHJhcHMiKSsKICBnZ3Bsb3QyOjp4bGFiKCJudW1iZXIgb2Ygbm9uLXplcm8gY29lZmZpY2llbnRzIikrCiAgZ2dwbG90Mjo6Z2VvbV9zZWdtZW50KGFlcyh4ID0gbnplcm9bMV0sIHkgPSBtZWRpYW5fY3ZtWzFdLCB4ZW5kID0gbnplcm9bMTVdLCB5ZW5kID0gbWVkaWFuX2N2bVsxNV0sIGNvbG91ciA9ICJzZWdtZW50IiksIGRhdGEgPSBjc3VtbWFyeV9QbGFjZW50YV9JVFVfd2EsIHNob3cubGVnZW5kID0gRikKCm5vbnplcm9fY2hvb3NlX1BsYWNlbnRhCmBgYAoKCmBgYHtyfQpwbmcoZmlsZW5hbWU9IlJlc3VsdHMvRmlndXJlcy9lbGFzdGljTmV0X3NpbmdsZVRpc3N1ZXMvT3V0Y29tZV9hZGQvYWxjb2hvbC9uemVyb19jaG9vc2VfUGxhY2VudGEucG5nIiwgd2lkdGg9MTYwMCwgaGVpZ2h0PTE0MDAsIHJlcz0zMDApCm5vbnplcm9fY2hvb3NlX1BsYWNlbnRhCmRldi5vZmYoKQpgYGAKCmBgYHtyfQpzdW1tYXJ5X1BsYWNlbnRhX0lUVV93YV9maW5hbG56ZXJvIDwtIGNzdW1tYXJ5X1BsYWNlbnRhX0lUVV93YVtuemVybyAlaW4lIG56ZXJvX2ZpbmFsX2l0dV9wbGFjZW50YV93YV0Kc2lnX3Zhcl9uYW1lc19QbGFjZW50YV9JVFVfd2FfZmluYWxuemVybyA8LSBGaWx0ZXIoZnVuY3Rpb24oeCkgYW55KHggPiAwLjc1KSwgc3VtbWFyeV9QbGFjZW50YV9JVFVfd2FfZmluYWxuemVyb1ssIWMoIm56ZXJvIiwgIm1lYW5fY3ZtIiwgIm1lZGlhbl9jdm0iKV0pICU+JSBjb2xuYW1lcygpCmNvbG5hbWVzKHN1bW1hcnlfUGxhY2VudGFfSVRVX3dhX2ZpbmFsbnplcm8pIDwtIGMoIm5vbi16ZXJvIiwgImNoaWxkIHNleCAoZmVtYWxlKSIsICJiaXJ0aCB3ZWlnaHQiLCAiYmlydGggbGVuZ3RoIiwgImhlYWQgY2lyY3VtZmVyZW5jZSIsICJkZWxpdmVyeSBtb2RlIChhaWRlZCkiLCAiaW5kdWNlZCBsYWJvciAoeWVzKSIsICJwYXJpdHkgKGJpcnRoIGJlZm9yZSkiLCAibWF0ZXJuYWwgYWdlIiwgIm1hdGVybmFsIEJNSSIsICJtYXRlcm5hbCBoeXBlcnRlbnNpb24gKHllcykiLCAibWF0ZXJuYWwgZGlhYmV0ZXMgKHllcykiLCAibWF0ZXJuYWwgbWVudGFsIGRpc29yZGVycyAoeWVzKSIsICJtYXRlcm5hbCBzbW9raW5nICh5ZXMpIiwgIm1hdGVybmFsIGFsY29ob2wgdXNlICh5ZXMpIiwgIm1lYW4gY3ZtIiwgIm1lZGlhbiBjdm0iKQpzdW1tYXJ5X1BsYWNlbnRhX0lUVV93YV9maW5hbG56ZXJvVCA8LSBhcy5kYXRhLmZyYW1lKHQoc3VtbWFyeV9QbGFjZW50YV9JVFVfd2FfZmluYWxuemVyb1ssLWMoIm5vbi16ZXJvIiwgIm1lZGlhbiBjdm0iLCAibWVhbiBjdm0iKV0pKQpzdW1tYXJ5X1BsYWNlbnRhX0lUVV93YV9maW5hbG56ZXJvVCR2YXJpYWJsZSA8LSByb3duYW1lcyhzdW1tYXJ5X1BsYWNlbnRhX0lUVV93YV9maW5hbG56ZXJvVCkKcm93bmFtZXMoc3VtbWFyeV9QbGFjZW50YV9JVFVfd2FfZmluYWxuemVyb1QpIDwtIE5VTEwKbmFtZXMoc3VtbWFyeV9QbGFjZW50YV9JVFVfd2FfZmluYWxuemVyb1QpW25hbWVzKHN1bW1hcnlfUGxhY2VudGFfSVRVX3dhX2ZpbmFsbnplcm9UKSA9PSAnVjEnXSA8LSAncGVyY2VudCcKc3VtbWFyeV9QbGFjZW50YV9JVFVfd2FfZmluYWx6ZXJvVCA8LSBzdW1tYXJ5X1BsYWNlbnRhX0lUVV93YV9maW5hbG56ZXJvVFtvcmRlcihzdW1tYXJ5X1BsYWNlbnRhX0lUVV93YV9maW5hbG56ZXJvVCRwZXJjZW50KSxdCgpzdW1tYXJ5X1BsYWNlbnRhX0lUVV93YV9maW5hbG56ZXJvVCRudW1iZXIgPC0gc2VxKDEsIGxlbmd0aChzdW1tYXJ5X1BsYWNlbnRhX0lUVV93YV9maW5hbG56ZXJvVCR2YXJpYWJsZSkpCmBgYAoKYGBge3IsIGZpZy53aWR0aD04fQpwZXJjX3ZhcnNfUGxhY2VudGFfSVRVX3dhIDwtIAogIGdncGxvdChzdW1tYXJ5X1BsYWNlbnRhX0lUVV93YV9maW5hbG56ZXJvVCwgYWVzKHJlb3JkZXIodmFyaWFibGUsIHBlcmNlbnQpLCBwZXJjZW50LCBncm91cD0xKSkrCiAgZ2VvbV9wb2ludCgpKyBnZW9tX2xpbmUoKSsKICB5bGFiKCIlIG9jY3VyZW5jZSBpbiBtb2RlbHMgd2l0aCBuemVybyBjb2VmZmljaWVudHMgPSA4IikrCiAgc2NhbGVfeV9jb250aW51b3VzKGJyZWFrcz1jKDAuMSwwLjIsMC4zLDAuNCwwLjUsMC42LDAuNywwLjgsMC45KSkrCiAgeGxhYigidmFyaWFibGUiKSsKICBjb29yZF9mbGlwKCkrCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0PTAuNzUsIGxpbmV0eXBlPSJkb3R0ZWQiKSsKICB0aGVtZV9idygpCgpwZXJjX3ZhcnNfUGxhY2VudGFfSVRVX3dhCgojIGRlY2lkZSBmb3IgY3V0LW9mZiAlIC0+IGhlcmUgLjc1CgpGaWx0ZXIoZnVuY3Rpb24oeCkgYW55KHggPiAwLjc1KSwgc3VtbWFyeV9QbGFjZW50YV9JVFVfd2FfZmluYWxuemVyb1ssIWMoIm5vbi16ZXJvIiwgIm1lYW4gY3ZtIiwgIm1lZGlhbiBjdm0iKV0pCgpgYGAKCmBgYHtyfQpwbmcoZmlsZW5hbWU9IlJlc3VsdHMvRmlndXJlcy9lbGFzdGljTmV0X3NpbmdsZVRpc3N1ZXMvT3V0Y29tZV9hZGQvYWxjb2hvbC92YXJzUGVyY2VudF9QbGFjZW50YS5wbmciLCB3aWR0aD0xMTAwLCBoZWlnaHQ9MTQwMCwgcmVzPTMwMCkKcGVyY192YXJzX1BsYWNlbnRhX0lUVV93YQpkZXYub2ZmKCkKYGBgCgoKICAKYGBge3J9CnBtMl9QbGFjZW50YV9JVFVfd2FfY29lZiA8LQogIGRjYXN0KHBtMl9QbGFjZW50YV9JVFVfd2FbLAogICAgICAgICAgICAgICAgICAgICAgICBhcy5saXN0KHVubGlzdCgKICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBwbHkoLlNELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbih4KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeSA8LSB1bm5hbWUocXVhbnRpbGUoeFt4ICE9IDBdLCBwcm9icyA9IGMoMC4wMjUsIDAuOTc1KSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdCgibm9uX3plcm8iID0gMTAwICogbWVhbih4ICE9IDApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGNsID0geVsxXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVjbCA9IHlbMl0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aCA9IGRpZmYoeSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYW4gPSBtZWRpYW4oeFt4IT0gMF0pKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSkpLAogICAgICAgICAgICAgICAgICAgICAgICAuU0Rjb2xzID0gYygiQ2hpbGRfU2V4ZmVtYWxlIiwgIkNoaWxkX0JpcnRoX1dlaWdodCIsICJDaGlsZF9CaXJ0aF9MZW5ndGgiLCAiQ2hpbGRfSGVhZF9DaXJjdW1mZXJlbmNlX0F0X0JpcnRoIiwgIkRlbGl2ZXJ5X21vZGVfZGljaG90b21haWRlZCIsICJJbmR1Y2VkX0xhYm91cnllcyIsICJQYXJpdHlfZGljaG90b21naXZlbiBiaXJ0aCBiZWZvcmUiLCAiTWF0ZXJuYWxfQWdlX1llYXJzIiwgIk1hdGVybmFsX0JvZHlfTWFzc19JbmRleF9pbl9FYXJseV9QcmVnbmFuY3kiLCAiTWF0ZXJuYWxfSHlwZXJ0ZW5zaW9uX2RpY2hvdG9taHlwZXJ0ZW5zaW9uIGluIGN1cnJlbnQgcHJlZ25hbmN5IiwgIk1hdGVybmFsX0RpYWJldGVzX2RpY2hvdG9tZGlhYmV0ZXMgaW4gY3VycmVudCBwcmVnbmFuY3kiLCAiTWF0ZXJuYWxfTWVudGFsX0Rpc29yZGVyc1llcyIsICJzbW9raW5nX2RpY2hvdG9teWVzIiwgIm1hdGVybmFsX2FsY29ob2xfdXNleWVzIiksCiAgICAgICAgICAgICAgICAgICAgICAgIGJ5ID0gbnplcm9dW29yZGVyKG56ZXJvKV0gJT4lCiAgICAgICAgICBtZWx0KGlkLnZhciA9ICJuemVybyIpICU+JQogICAgICAgICAgLlssIG1ldHJpYyA6PSBzdWIoIl4uK1xcLiguKykkIiwgIlxcMSIsIHZhcmlhYmxlKV0gJT4lCiAgICAgICAgICAuWywgdmFyaWFibGUgOj0gc3ViKCJeKC4rKVxcLi4rJCIsICJcXDEiLCB2YXJpYWJsZSldICU+JQogICAgICAgICAgLltuemVybyA9PSBuemVyb19maW5hbF9pdHVfcGxhY2VudGFfd2FdLCBuemVybysgdmFyaWFibGUgfiBtZXRyaWMsIHZhbHVlLnZhcj0idmFsdWUiKQoKIyBnZXQgZGVzaXJlZCBvcmRlciBvZiBwcmVkaWN0b3JzCnBtMl9QbGFjZW50YV9JVFVfd2FfY29lZiA8LQogIHBtMl9QbGFjZW50YV9JVFVfd2FfY29lZlttYXRjaChjKCJDaGlsZF9TZXhmZW1hbGUiLCAiQ2hpbGRfQmlydGhfV2VpZ2h0IiwgIkNoaWxkX0JpcnRoX0xlbmd0aCIsICJDaGlsZF9IZWFkX0NpcmN1bWZlcmVuY2VfQXRfQmlydGgiLCAiRGVsaXZlcnlfbW9kZV9kaWNob3RvbWFpZGVkIiwgIkluZHVjZWRfTGFib3VyeWVzIiwgIlBhcml0eV9kaWNob3RvbWdpdmVuIGJpcnRoIGJlZm9yZSIsICJNYXRlcm5hbF9BZ2VfWWVhcnMiLCAiTWF0ZXJuYWxfQm9keV9NYXNzX0luZGV4X2luX0Vhcmx5X1ByZWduYW5jeSIsICJNYXRlcm5hbF9IeXBlcnRlbnNpb25fZGljaG90b21oeXBlcnRlbnNpb24gaW4gY3VycmVudCBwcmVnbmFuY3kiLCAiTWF0ZXJuYWxfRGlhYmV0ZXNfZGljaG90b21kaWFiZXRlcyBpbiBjdXJyZW50IHByZWduYW5jeSIsICJNYXRlcm5hbF9NZW50YWxfRGlzb3JkZXJzWWVzIiwgInNtb2tpbmdfZGljaG90b215ZXMiLCAibWF0ZXJuYWxfYWxjb2hvbF91c2V5ZXMiKSwgcG0yX1BsYWNlbnRhX0lUVV93YV9jb2VmJHZhcmlhYmxlKSxdCnBtMl9QbGFjZW50YV9JVFVfd2FfY29lZiR2YXJpYWJsZSA8LSBmYWN0b3IocG0yX1BsYWNlbnRhX0lUVV93YV9jb2VmJHZhcmlhYmwsIGxldmVscz11bmlxdWUocG0yX1BsYWNlbnRhX0lUVV93YV9jb2VmJHZhcmlhYmxlKSkKYGBgCgpgYGB7cn0Kc2lnX3ZhcnNfUGxhY2VudGFfSVRVX3dhIDwtCiAgcG0yX1BsYWNlbnRhX0lUVV93YV9jb2VmICU+JQogIGdncGxvdDI6OmdncGxvdCguKSArCiAgZ2dwbG90Mjo6dGhlbWVfYncoKSArCiAgZ2dwbG90Mjo6dGhlbWUoYXhpcy50ZXh0Lng9ZWxlbWVudF9ibGFuaygpKSsKICBnZ3Bsb3QyOjphZXMoeD0ibnplcm8iKSsKICBnZ3Bsb3QyOjpnZW9tX3BvaW50KG1hcHBpbmcgPSBnZ3Bsb3QyOjphZXMoeSA9IHZhcmlhYmxlLCBzaXplID1ub25femVybywgYWxwaGEgPSBub25femVybywgY29sb3IgPSBub25femVybykpICsKICBnZ3Bsb3QyOjpnZW9tX3RleHQoYWVzKHk9dmFyaWFibGUsIGxhYmVsPXNwcmludGYoIiUwLjJmIiwgcm91bmQobWVkaWFuLCBkaWdpdHM9MikpLCBzaXplPTUwKSxoanVzdD0wLCB2anVzdD0wLjUsIG51ZGdlX3ggPSAwLjEpKwogIGdncGxvdDI6OnNjYWxlX2NvbG9yX2dyYWRpZW50MihoaWdoID0gJ2dyZWVuJywgbWlkID0gInB1cnBsZSIsIGxvdyA9ICJibGFjayIsIG1pZHBvaW50ID01MCkrCiAgZ2dwbG90Mjo6c2NhbGVfYWxwaGEoZ3VpZGUgPSAnbm9uZScpKwogIGdncGxvdDI6OnNjYWxlX3NpemUoZ3VpZGUgPSAnbm9uZScpKwogIGdncGxvdDI6OnNjYWxlX3lfZGlzY3JldGUobGFiZWxzPSBjKCJjaGlsZCBzZXggKGZlbWFsZSkiLCAiYmlydGggd2VpZ2h0IiwgImJpcnRoIGxlbmd0aCIsICJoZWFkIGNpcmN1bWZlcmVuY2UiLCAiZGVsaXZlcnkgbW9kZSAoYWlkZWQpIiwgImluZHVjZWQgbGFib3IgKHllcykiLCAicGFyaXR5IChiaXJ0aCBiZWZvcmUpIiwgIm1hdGVybmFsIGFnZSIsICJtYXRlcm5hbCBCTUkiLCAibWF0ZXJuYWwgaHlwZXJ0ZW5zaW9uICh5ZXMpIiwgIm1hdGVybmFsIGRpYWJldGVzICh5ZXMpIiwgIm1hdGVybmFsIG1lbnRhbCBkaXNvcmRlcnMgKHllcykiLCAibWF0ZXJuYWwgc21va2luZyAoeWVzKSIsICJtYXRlcm5hbCBhbGNvaG9sIHVzZSAoeWVzKSIpKSsKICBnZ3Bsb3QyOjpsYWJzKHk9InByZWRpY3RvciIsIHggPSAibnVtYmVyIG9mIG5vbi16ZXJvIGNvZWZmaWNpZW50cyA9IDciLCBjb2xvcj0iJSIpCgpgYGAKCmBgYHtyfQpjb2VmX1BsYWNlbnRhX0lUVV93YSA8LSAKICBnZ3Bsb3QocG0yX1BsYWNlbnRhX0lUVV93YV9jb2VmLCBhZXMoeSA9IHZhcmlhYmxlLCB4PW1lZGlhbikpKwogIGdlb21fcG9pbnQobWFwcGluZyA9IGdncGxvdDI6OmFlcyh5ID0gdmFyaWFibGUsIHNpemUgPW5vbl96ZXJvLCBhbHBoYSA9IG5vbl96ZXJvLCBjb2xvciA9IG5vbl96ZXJvKSkrCiAgc2NhbGVfY29sb3JfZ3JhZGllbnQyKGhpZ2ggPSAnZ3JlZW4nLCBtaWQgPSAicHVycGxlIiwgbG93ID0gImJsYWNrIiwgbWlkcG9pbnQgPTUwLCBsaW1pdHM9YygwLDEwMCkpKwogIHNjYWxlX2FscGhhKGd1aWRlID0gJ25vbmUnKSsKICBzY2FsZV9zaXplKGd1aWRlID0gJ25vbmUnKSsKICBnZW9tX3BvaW50KCkrCiAgZ2VvbV9lcnJvcmJhcihhZXMoeSA9IHZhcmlhYmxlLCB4bWluID0gbGNsLCB4bWF4ID0gdWNsKSwgd2lkdGggPSAwLjIpKwogIGxhYnMoeT0icHJlZGljdG9yIiwgeCA9ICJcbm1lZGlhbiAmIDk1JSBDSSBvZiBjb2VmZmljaWVudCAob3ZlciBib290c3RyYXBzKSIsIGNvbG9yPSIlIikrCiAgc2NhbGVfeF9jb250aW51b3VzKGxpbWl0cz1jKC0wLjQsMC40KSwgYnJlYWtzPWMoLS40LC0uMywtLjIsIC0uMSwgMCwgLjEsIC4yLCAuMywgLjQpKSsKICBzY2FsZV95X2Rpc2NyZXRlKGxhYmVscz0gYygiY2hpbGQgc2V4IChmZW1hbGUpIiwgImJpcnRoIHdlaWdodCIsICJiaXJ0aCBsZW5ndGgiLCAiaGVhZCBjaXJjdW1mZXJlbmNlIiwgImRlbGl2ZXJ5IG1vZGUgKGFpZGVkKSIsICJpbmR1Y2VkIGxhYm9yICh5ZXMpIiwgInBhcml0eSAoYmlydGggYmVmb3JlKSIsICJtYXRlcm5hbCBhZ2UiLCAibWF0ZXJuYWwgQk1JIiwgIm1hdGVybmFsIGh5cGVydGVuc2lvbiAoeWVzKSIsICJtYXRlcm5hbCBkaWFiZXRlcyAoeWVzKSIsICJtYXRlcm5hbCBtZW50YWwgZGlzb3JkZXJzICh5ZXMpIiwgIm1hdGVybmFsIHNtb2tpbmcgKHllcykiLCAibWF0ZXJuYWwgYWxjb2hvbCB1c2UgKHllcykiKSkrCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0PTAsIGxpbmV0eXBlPSJkYXNoZWQiKSsKICB0aGVtZV9idygpKwogIHRoZW1lKHRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE1KSwgYXhpcy50aXRsZS54PSBlbGVtZW50X3RleHQoc2l6ZT0xNSksIGF4aXMudGl0bGUueT0gZWxlbWVudF90ZXh0KHNpemU9MTUpKQoKCmNvZWZfUGxhY2VudGFfSVRVX3dhIApgYGAKCgpgYGB7cn0KcG5nKGZpbGVuYW1lPSJSZXN1bHRzL0ZpZ3VyZXMvZWxhc3RpY05ldF9zaW5nbGVUaXNzdWVzL091dGNvbWVfYWRkL2FsY29ob2wvY29lZl9QbGFjZW50YS5wbmciLCB3aWR0aD0yODAwLCBoZWlnaHQ9MTQwMCwgcmVzPTQwMCkKY29lZl9QbGFjZW50YV9JVFVfd2EKZGV2Lm9mZigpCmBgYAoKYGBge3J9CnAxIDwtCiAgIGNzdW1tYXJ5X1BsYWNlbnRhX0lUVV93YSAlPiUKICBtZWx0KGlkLnZhcnMgPSBjKCJuemVybyIsICJtZWFuX2N2bSIsICJtZWRpYW5fY3ZtIikpICU+JQogIGdncGxvdDI6OmdncGxvdCguKSArCiAgZ2dwbG90Mjo6dGhlbWVfYncoKSArCiAgZ2dwbG90Mjo6YWVzKHggPSBuemVybykgKwogIGdncGxvdDI6Omdlb21fcG9pbnQobWFwcGluZyA9IGdncGxvdDI6OmFlcyh5ID0gdmFyaWFibGUsIHNpemUgPSB2YWx1ZSwgYWxwaGEgPSB2YWx1ZSwgY29sb3IgPSB2YWx1ZSoxMDApKSArCiAgZ2dwbG90Mjo6c2NhbGVfY29sb3JfZ3JhZGllbnQyKGhpZ2ggPSAnZ3JlZW4nLCBtaWQgPSAicHVycGxlIiwgbG93ID0gImJsYWNrIiwgbWlkcG9pbnQgPTUwKSsKICBnZ3Bsb3QyOjpzY2FsZV9hbHBoYShndWlkZSA9ICdub25lJykrCiAgZ2dwbG90Mjo6c2NhbGVfc2l6ZShndWlkZSA9ICdub25lJykrCiAgZ2dwbG90Mjo6c2NhbGVfeV9kaXNjcmV0ZShsYWJlbHM9IGMoImNoaWxkIHNleCAoZmVtYWxlKSIsICJiaXJ0aCB3ZWlnaHQiLCAiYmlydGggbGVuZ3RoIiwgImhlYWQgY2lyY3VtZmVyZW5jZSIsICJkZWxpdmVyeSBtb2RlIChhaWRlZCkiLCAiaW5kdWNlZCBsYWJvciAoeWVzKSIsICJwYXJpdHkgKGJpcnRoIGJlZm9yZSkiLCAibWF0ZXJuYWwgYWdlIiwgIm1hdGVybmFsIEJNSSIsICJtYXRlcm5hbCBoeXBlcnRlbnNpb24gKHllcykiLCAibWF0ZXJuYWwgZGlhYmV0ZXMgKHllcykiLCAibWF0ZXJuYWwgbWVudGFsIGRpc29yZGVycyAoeWVzKSIsICJtYXRlcm5hbCBzbW9raW5nICh5ZXMpIiwgIm1hdGVybmFsIGFsY29ob2wgdXNlICh5ZXMpIikpKwogIGdncGxvdDI6OnNjYWxlX3hfY29udGludW91cyhicmVha3M9MDoxNCwgbGFiZWxzPSkrCiAgZ2dwbG90Mjo6bGFicyh5PSJwcmVkaWN0b3IiLCB4ID0gIlxubnVtYmVyIG9mIG5vbi16ZXJvIGNvZWZmaWNpZW50cyIsIGNvbG9yPSIlIikrCiAgZ2dwbG90Mjo6dGhlbWUodGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTcpLCBheGlzLnRpdGxlLng9IGVsZW1lbnRfdGV4dChzaXplPTE1KSwgYXhpcy50aXRsZS55PSBlbGVtZW50X3RleHQoc2l6ZT0xNSksIGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikKICAKcDIgPC0gCiAgZ2dwbG90KHBtMl9QbGFjZW50YV9JVFVfd2FfY29lZiwgYWVzKHkgPSB2YXJpYWJsZSwgeD1tZWRpYW4pKSsKICBnZW9tX3BvaW50KG1hcHBpbmcgPSBnZ3Bsb3QyOjphZXMoeSA9IHZhcmlhYmxlLCBzaXplID1ub25femVybywgYWxwaGEgPSBub25femVybywgY29sb3IgPSBub25femVybykpKwogIHNjYWxlX2NvbG9yX2dyYWRpZW50MihoaWdoID0gJ2dyZWVuJywgbWlkID0gInB1cnBsZSIsIGxvdyA9ICJibGFjayIsIG1pZHBvaW50ID01MCwgbGltaXRzPWMoMCwxMDApKSsKICBzY2FsZV9hbHBoYShndWlkZSA9ICdub25lJykrCiAgc2NhbGVfc2l6ZShndWlkZSA9ICdub25lJykrCiAgZ2VvbV9wb2ludCgpKwogIGdlb21fZXJyb3JiYXIoYWVzKHkgPSB2YXJpYWJsZSwgeG1pbiA9IGxjbCwgeG1heCA9IHVjbCksIHdpZHRoID0gMC4yKSsKICBsYWJzKHk9IiIsIHggPSAiXG5tZWRpYW4gJiA5NSUgQ0kgb2YgY29lZmZpY2llbnQgKG92ZXIgYm9vdHN0cmFwcykiLCBjb2xvcj0iJSIpKwogIHNjYWxlX3hfY29udGludW91cyhsaW1pdHM9YygtMC40LDAuNCksIGJyZWFrcz1jKC0uNCwtLjMsLS4yLCAtLjEsIDAsIC4xLCAuMiwgLjMsIC40KSkrCiAgc2NhbGVfeV9kaXNjcmV0ZShsYWJlbHM9IGMoImNoaWxkIHNleCAoZmVtYWxlKSIsICJiaXJ0aCB3ZWlnaHQiLCAiYmlydGggbGVuZ3RoIiwgImhlYWQgY2lyY3VtZmVyZW5jZSIsICJkZWxpdmVyeSBtb2RlIChhaWRlZCkiLCAiaW5kdWNlZCBsYWJvciAoeWVzKSIsICJwYXJpdHkgKGJpcnRoIGJlZm9yZSkiLCAibWF0ZXJuYWwgYWdlIiwgIm1hdGVybmFsIEJNSSIsICJtYXRlcm5hbCBoeXBlcnRlbnNpb24gKHllcykiLCAibWF0ZXJuYWwgZGlhYmV0ZXMgKHllcykiLCAibWF0ZXJuYWwgbWVudGFsIGRpc29yZGVycyAoeWVzKSIsICJtYXRlcm5hbCBzbW9raW5nICh5ZXMpIiwgIm1hdGVybmFsIGFsY29ob2wgdXNlICh5ZXMpIikpKwogIGdlb21fdmxpbmUoeGludGVyY2VwdD0wLCBsaW5ldHlwZT0iZGFzaGVkIikrCiAgdGhlbWVfYncoKSsKICBnZ3RpdGxlKCJuemVybyA9IDYiKSsKICB0aGVtZSh0ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNyksIGF4aXMudGl0bGUueD0gZWxlbWVudF90ZXh0KHNpemU9MTUpLCBheGlzLnRpdGxlLnk9IGVsZW1lbnRfdGV4dChzaXplPTE1KSwgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplPTE1KSwgYXhpcy50ZXh0Lnk9ZWxlbWVudF9ibGFuaygpKQoKZzEgPC0gZ2dwbG90R3JvYihwMSkKZzIgPC0gZ2dwbG90R3JvYihwMikKZyA8LSBjYmluZChnMSwgZzIsIHNpemUgPSAibGFzdCIpCmckaGVpZ2h0cyA8LSB1bml0LnBtYXgoZzEkaGVpZ2h0cywgZzIkaGVpZ2h0cykKCnBuZyhmaWxlbmFtZT0iUmVzdWx0cy9GaWd1cmVzL2VsYXN0aWNOZXRfc2luZ2xlVGlzc3Vlcy9PdXRjb21lX2FkZC9hbGNvaG9sL01vZGVsX2NvZWZfUGxhY2VudGEucG5nIiwgd2lkdGg9NTgwMCwgaGVpZ2h0PTE2MDAsIHJlcz00MDApCmdyaWQuZHJhdyhnKQpkZXYub2ZmKCkKYGBgCgpbdG8gdGhlIHRvcF0oI3RvcCkKCiMjIFBsYWNlbnRhIGVsYXN0aWMgbmV0IHNwbGl0dGVkIGJ5IHNleCB7I2VsYXN0aWNuZXRQbGFjZW50YUlUVV9zfSAgCm1vZGVsIHdpdGhvdXQgYWxjb2hvbCB2YXJpYWJsZSwgYnV0IHNwbGl0dGVkIGJ5IHNleAoKIyMjIG1hbGVzCiAgCmBgYHtyfQojIGluIGNhc2UgeW91IHdhbnQgdG8gc3RhcnQgZnJvbSBoZXJlCmxvYWQoIklucHV0RGF0YS9DbG9ja0NhbGN1bGF0aW9uc0lucHV0L1JlZ19JbnB1dF9EYXRhX1BsYWNlbnRhX21hbGVfSVRVX0VBQVJfbm9OYV9uLlJkYXRhIikKUmVnX0lucHV0X0RhdGFfUGxhY2VudGFfbWFsZV9JVFVfRUFBUl9ub05hX24kQ2hpbGRfU2V4IDwtIE5VTEwKYGBgCgoKYGBge3J9CnlyY19tYXRfSVRVX1BsYWNlbnRhX21hbGVfbiA8LSBtYXRyaXgoUmVnX0lucHV0X0RhdGFfUGxhY2VudGFfbWFsZV9JVFVfRUFBUl9ub05hX24kRUFBUl9MZWUpCnhyY19tYXRfSVRVX1BsYWNlbnRhX21hbGVfbiA8LSBtb2RlbC5tYXRyaXgoIH4gLiAtIEVBQVJfTGVlLCBkYXRhID0gUmVnX0lucHV0X0RhdGFfUGxhY2VudGFfbWFsZV9JVFVfRUFBUl9ub05hX24pWywgLTFdCnlyY19tYXRfSVRVX3NjYWxlZF9QbGFjZW50YV9tYWxlX24gPC0gc2NhbGUoeXJjX21hdF9JVFVfUGxhY2VudGFfbWFsZV9uKQp4cmNfbWF0X0lUVV9zY2FsZWRfUGxhY2VudGFfbWFsZV9uIDwtIHNjYWxlKHhyY19tYXRfSVRVX1BsYWNlbnRhX21hbGVfbikKYGBgCgo8IS0tIHNldCBzZWVkIC0tPgo8IS0tIGBgYHtyfSAtLT4KPCEtLSBzZXQuc2VlZCgyMDIwKSAtLT4KPCEtLSBgYGAgLS0+CgoKPCEtLSBgYGB7ciwgd2FybmluZz1GfSAtLT4KPCEtLSAgIG5ib290ID0gMTAwMCAtLT4KCjwhLS0gICBzdGFydF90aW1lIDwtIFN5cy50aW1lKCkgLS0+CjwhLS0gICBib290c3RyYXBzX1BsYWNlbnRhX21hbGVfSVRVX24gPC0gcmVwbGljYXRlKG5ib290LCB7IC0tPgo8IS0tICAgICByd3MgPC0gc2FtcGxlKDE6bnJvdyh4cmNfbWF0X0lUVV9zY2FsZWRfUGxhY2VudGFfbWFsZV9uKSwgcmVwbGFjZSA9IFRSVUUpIC0tPgo8IS0tICAgICBlbnNyKHhyY19tYXRfSVRVX3NjYWxlZF9QbGFjZW50YV9tYWxlX25bcndzLCBdLCB5cmNfbWF0X0lUVV9zY2FsZWRfUGxhY2VudGFfbWFsZV9uW3J3cywgXSwgc3RhbmRhcmRpemVkID0gRkFMU0UsIGZhbWlseT0iZ2F1c3NpYW4iLCBubGFtYmRhPTEwMCwgbmZvbGRzPTEwLCBhbHBoYT1jKDAuMCwwLjEsMC4yLDAuMywwLjQsMC41LDAuNiwwLjcsMC44LDAuOSwxLjApKSAtLT4KPCEtLSAgIH0sIC0tPgo8IS0tICAgc2ltcGxpZnkgPSBGQUxTRSkgLS0+Cgo8IS0tIGBgYCAtLT4KCjwhLS0gYGBge3J9IC0tPgo8IS0tIHNhdmUoYm9vdHN0cmFwc19QbGFjZW50YV9tYWxlX0lUVV9uLCBmaWxlPSJJbnB1dERhdGEvRGF0YV9FbGFzdGljTmV0cy9ib290c3RyYXBzX1BsYWNlbnRhX21hbGVfSVRVX25fMTAwMC5SZGF0YSIpIC0tPgo8IS0tIGBgYCAtLT4KCgpgYGB7cn0KbG9hZCgiSW5wdXREYXRhL0RhdGFfRWxhc3RpY05ldHMvYm9vdHN0cmFwc19QbGFjZW50YV9tYWxlX0lUVV9uXzEwMDAuUmRhdGEiKQpgYGAKCgpgYGB7cn0Kc3VtbWFyaWVzX1BsYWNlbnRhX21hbGVfSVRVX24gPC0KICBib290c3RyYXBzX1BsYWNlbnRhX21hbGVfSVRVX24gJT4lCiAgbGFwcGx5KHN1bW1hcnkpICU+JQogIHJiaW5kbGlzdChpZGNvbCA9ICJib290c3RyYXAiKQoKc3VtbWFyaWVzX1BsYWNlbnRhX21hbGVfSVRVX24KYGBgCgpgYGB7cn0Kc3VtbWFyaWVzX1BsYWNlbnRhX21hbGVfSVRVX25bLCAuU0RbY3ZtID09IG1pbihjdm0pXSwgYnkgPSBjKCJib290c3RyYXAiLCAibnplcm8iKV0gJT4lCiAgZ2dwbG90Mjo6Z2dwbG90KGRhdGEgPSAuKSArCiAgZ2dwbG90Mjo6YWVzKHggPSBuemVybywgeSA9IGN2bSwgZ3JvdXAgPSBib290c3RyYXApICsKICBnZ3Bsb3QyOjpnZW9tX3BvaW50KCkgKwogIGdncGxvdDI6Omdlb21fbGluZSgpCmBgYAoKCmBgYHtyfQpwbmcoZmlsZW5hbWU9IlJlc3VsdHMvRmlndXJlcy9lbGFzdGljTmV0X3NpbmdsZVRpc3N1ZXMvT3V0Y29tZV9hZGQvc2V4X3NwbGl0L2Jvb3RzdHJhcHNfUGxhY2VudGFfTUFMRS5wbmciLCB3aWR0aD04MDAsIGhlaWdodD02MDApCnN1bW1hcmllc19QbGFjZW50YV9tYWxlX0lUVV9uWywgLlNEW2N2bSA9PSBtaW4oY3ZtKV0sIGJ5ID0gYygiYm9vdHN0cmFwIiwgIm56ZXJvIildICU+JQogIGdncGxvdDI6OmdncGxvdChkYXRhID0gLikgKwogIGdncGxvdDI6OmFlcyh4ID0gbnplcm8sIHkgPSBjdm0sIGdyb3VwID0gYm9vdHN0cmFwKSArCiAgZ2dwbG90Mjo6Z2VvbV9wb2ludCgpICsKICBnZ3Bsb3QyOjpnZW9tX2xpbmUoKQpkZXYub2ZmKCkKYGBgCgoKPCEtLSBgYGB7ciwgd2FybmluZz1GQUxTRX0gLS0+CjwhLS0gIyBsb3dlc3QgY3ZtIGJ5IGJvb3RzdHJhcCBhbmQgbnplcm8gLS0+CjwhLS0gcG1fUGxhY2VudGFfbWFsZV9JVFVfbiA8LSBzdW1tYXJpZXNfUGxhY2VudGFfbWFsZV9JVFVfblssIC5TRFtjdm0gPT0gbWluKGN2bSldLCBieSA9IGMoImJvb3RzdHJhcCIsICJuemVybyIpXSAtLT4KPCEtLSBwbTJfUGxhY2VudGFfbWFsZV9JVFVfbiA8LSBOVUxMIC0tPgoKPCEtLSBmb3IoaSBpbiBhcy5pbnRlZ2VyKHNlcSgxLCBucm93KHBtX1BsYWNlbnRhX21hbGVfSVRVX24pLCBieSA9IDEpKSkgeyAtLT4KPCEtLSAgIHBtMl9QbGFjZW50YV9tYWxlX0lUVV9uIDwtIHJiaW5kKHBtMl9QbGFjZW50YV9tYWxlX0lUVV9uLCAtLT4KPCEtLSAgICAgICAgICAgICAgICBjYmluZChwbV9QbGFjZW50YV9tYWxlX0lUVV9uW2ksIF0sIC0tPgo8IS0tICAgICAgICAgICAgICAgIHQoYXMubWF0cml4KGNvZWYoYm9vdHN0cmFwc19QbGFjZW50YV9tYWxlX0lUVV9uW1twbV9QbGFjZW50YV9tYWxlX0lUVV9uW2ksIGJvb3RzdHJhcF1dXVtbcG1fUGxhY2VudGFfbWFsZV9JVFVfbltpLCBsX2luZGV4XV1dLCBzID0gcG1fUGxhY2VudGFfbWFsZV9JVFVfbltpLCBsYW1iZGFdKSkpIC0tPgo8IS0tICAgICAgICAgICAgICAgICkgLS0+CjwhLS0gICApIC0tPgo8IS0tIH0gLS0+Cgo8IS0tIHBtMl9QbGFjZW50YV9tYWxlX0lUVV9uIC0tPgo8IS0tIGBgYCAtLT4KCgo8IS0tIGBgYHtyfSAtLT4KPCEtLSAjIHNhdmUgInByZWZlcmFibGUgbW9kZWxzIiAtLT4KPCEtLSBzYXZlKHBtMl9QbGFjZW50YV9tYWxlX0lUVV9uLCBmaWxlPSJJbnB1dERhdGEvRGF0YV9FbGFzdGljTmV0cy9wbTJfUGxhY2VudGFfbWFsZV9JVFVfbi5SZGF0YSIpIC0tPgo8IS0tIGBgYCAtLT4KCgpgYGB7cn0KbG9hZCgiSW5wdXREYXRhL0RhdGFfRWxhc3RpY05ldHMvcG0yX1BsYWNlbnRhX21hbGVfSVRVX24uUmRhdGEiKQojIGNvZWZmaWNpZW50IHZhbHVlcyBmb3IgdGhlIG1vZGVscyB3aXRoIHNtYWxsZXN0IGN2bSBieSBudW1iZXIgb2Ygbm9uLWVyem8gY29lZmZpY2llbnRzIGFuZCBib290c3RyYXAKYGBgCgoKYGBge3J9CmNzdW1tYXJ5X1BsYWNlbnRhX21hbGVfSVRVX24gPC0gUmVkdWNlKGZ1bmN0aW9uKHgseSkgbWVyZ2UoeCA9IHgsIHkgPSB5LCBieSA9ICJuemVybyIpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdChwbTJfUGxhY2VudGFfbWFsZV9JVFVfblssIGxhcHBseSguU0QsIGZ1bmN0aW9uKHgpIHttZWFuKHggIT0gMCl9KSwgLlNEY29scyA9IGMoIkNoaWxkX0JpcnRoX1dlaWdodCIsICJDaGlsZF9CaXJ0aF9MZW5ndGgiLCAiQ2hpbGRfSGVhZF9DaXJjdW1mZXJlbmNlX0F0X0JpcnRoIiwgIkRlbGl2ZXJ5X21vZGVfZGljaG90b21haWRlZCIsICJJbmR1Y2VkX0xhYm91cnllcyIsICJQYXJpdHlfZGljaG90b21naXZlbiBiaXJ0aCBiZWZvcmUiLCAiTWF0ZXJuYWxfQWdlX1llYXJzIiwgIk1hdGVybmFsX0JvZHlfTWFzc19JbmRleF9pbl9FYXJseV9QcmVnbmFuY3kiLCAiTWF0ZXJuYWxfSHlwZXJ0ZW5zaW9uX2RpY2hvdG9taHlwZXJ0ZW5zaW9uIGluIGN1cnJlbnQgcHJlZ25hbmN5IiwgIk1hdGVybmFsX0RpYWJldGVzX2RpY2hvdG9tZGlhYmV0ZXMgaW4gY3VycmVudCBwcmVnbmFuY3kiLCAiTWF0ZXJuYWxfTWVudGFsX0Rpc29yZGVyc1llcyIsICJzbW9raW5nX2RpY2hvdG9teWVzIiksIGJ5ID0gbnplcm9dCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBtMl9QbGFjZW50YV9tYWxlX0lUVV9uWywgLihtZWFuX2N2bSA9IG1lYW4oY3ZtKSksIGJ5ID0gbnplcm9dLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBtMl9QbGFjZW50YV9tYWxlX0lUVV9uWywgLihtZWRpYW5fY3ZtID0gbWVkaWFuKGN2bSkpLCBieSA9IG56ZXJvXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICApKVtvcmRlcihuemVybyldCgpjc3VtbWFyeV9QbGFjZW50YV9tYWxlX0lUVV9uCmBgYAoKCmBgYHtyfQpnMV9QbGFjZW50YV9tYWxlX0lUVV9uIDwtCiAgY3N1bW1hcnlfUGxhY2VudGFfbWFsZV9JVFVfbiAlPiUKICBtZWx0KGlkLnZhcnMgPSBjKCJuemVybyIsICJtZWFuX2N2bSIsICJtZWRpYW5fY3ZtIikpICU+JQogIGdncGxvdDI6OmdncGxvdCguKSArCiAgZ2dwbG90Mjo6dGhlbWVfYncoKSArCiAgZ2dwbG90Mjo6YWVzKHggPSBuemVybykgKwogIGdncGxvdDI6Omdlb21fcG9pbnQobWFwcGluZyA9IGdncGxvdDI6OmFlcyh5ID0gdmFyaWFibGUsIHNpemUgPSB2YWx1ZSwgYWxwaGEgPSB2YWx1ZSwgY29sb3IgPSB2YWx1ZSoxMDApKSArCiAgZ2dwbG90Mjo6c2NhbGVfY29sb3JfZ3JhZGllbnQyKGhpZ2ggPSAnZ3JlZW4nLCBtaWQgPSAicHVycGxlIiwgbG93ID0gImJsYWNrIiwgbWlkcG9pbnQgPTUwKSsKICBnZ3Bsb3QyOjpzY2FsZV9hbHBoYShndWlkZSA9ICdub25lJykrCiAgZ2dwbG90Mjo6c2NhbGVfc2l6ZShndWlkZSA9ICdub25lJykrCiAgZ2dwbG90Mjo6c2NhbGVfeV9kaXNjcmV0ZShsYWJlbHM9IGMoImJpcnRoIHdlaWdodCIsICJiaXJ0aCBsZW5ndGgiLCAiaGVhZCBjaXJjdW1mZXJlbmNlIiwgImRlbGl2ZXJ5IG1vZGUiLCAiaW5kdWNlZCBsYWJvciIsICJwYXJpdHkiLCAibWF0ZXJuYWwgYWdlIiwgIm1hdGVybmFsIEJNSSIsICJtYXRlcm5hbCBoeXBlcnRlbnNpb24iLCAibWF0ZXJuYWwgZGlhYmV0ZXMiLCAibWF0ZXJuYWwgbWVudGFsIGRpc29yZGVycyIsICJtYXRlcm5hbCBzbW9raW5nIikpKwogIGdncGxvdDI6OnNjYWxlX3hfY29udGludW91cyhicmVha3M9MDoxNCwgbGFiZWxzPSkrCiAgZ2dwbG90Mjo6bGFicyh5PSJwcmVkaWN0b3IiLCB4ID0gIm51bWJlciBvZiBub24temVybyBjb2VmZmljaWVudHMiLCBjb2xvcj0iJSIpKwogIGdncGxvdDI6OnRoZW1lKHRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE1KSwgYXhpcy50aXRsZS54PSBlbGVtZW50X3RleHQoc2l6ZT0xNSksIGF4aXMudGl0bGUueT0gZWxlbWVudF90ZXh0KHNpemU9MTUpKQoKZzJfUGxhY2VudGFfbWFsZV9JVFVfbiA8LQogIGNzdW1tYXJ5X1BsYWNlbnRhX21hbGVfSVRVX24gJT4lCiAgZ2dwbG90Mjo6Z2dwbG90KC4pICsKICBnZ3Bsb3QyOjp0aGVtZV9idygpICsKICBnZ3Bsb3QyOjphZXMoeCA9IG56ZXJvLCB5ID0gbWVkaWFuX2N2bSkgKwogIGdncGxvdDI6Omdlb21fcG9pbnQoKSArIGdncGxvdDI6Omdlb21fbGluZSgpKwogIGdncGxvdDI6OmxhYnMoeT0ibWVkaWFuIGN2bSIsIHggPSAibnVtYmVyIG9mIG5vbi16ZXJvIGNvZWZmaWNpZW50cyIpKwogIGdncGxvdDI6OnNjYWxlX3hfY29udGludW91cyhicmVha3M9MDoxNCwgbGFiZWxzPSkrCiAgZ2dwbG90Mjo6dGhlbWUoYXhpcy50ZXh0PWVsZW1lbnRfdGV4dChzaXplPTE1KSxheGlzLnRpdGxlPWVsZW1lbnRfdGV4dChzaXplPTE4KSkKCgpncmlkRXh0cmE6OmdyaWQuYXJyYW5nZShnMV9QbGFjZW50YV9tYWxlX0lUVV9uLCBnMl9QbGFjZW50YV9tYWxlX0lUVV9uLCBuY29sID0gMSkKCmBgYAoKCmBgYHtyfQpwbmcoZmlsZW5hbWU9IlJlc3VsdHMvRmlndXJlcy9lbGFzdGljTmV0X3NpbmdsZVRpc3N1ZXMvT3V0Y29tZV9hZGQvc2V4X3NwbGl0L2Jvb3RzdHJhcE1vZGVsc19QbGFjZW50YV9tYWxlLnBuZyIsIHdpZHRoPTI0MDAsIGhlaWdodD0xODAwLCByZXM9MzAwKQpncmlkRXh0cmE6OmdyaWQuYXJyYW5nZShnMV9QbGFjZW50YV9tYWxlX0lUVV9uLCBnMl9QbGFjZW50YV9tYWxlX0lUVV9uLCBuY29sID0gMSkKZGV2Lm9mZigpCmBgYAoKYGBge3J9CnBuZyhmaWxlbmFtZT0iUmVzdWx0cy9GaWd1cmVzL2VsYXN0aWNOZXRfc2luZ2xlVGlzc3Vlcy9PdXRjb21lX2FkZC9zZXhfc3BsaXQvTW9kZWxfUGxhY2VudGFfbWFsZS5wbmciLCB3aWR0aD0yODAwLCBoZWlnaHQ9MTQwMCwgcmVzPTQwMCkKZzFfUGxhY2VudGFfbWFsZV9JVFVfbgpkZXYub2ZmKCkKYGBgCgoKYGBge3J9CmVsYm93X2ZpbmRlcihjc3VtbWFyeV9QbGFjZW50YV9tYWxlX0lUVV9uJG56ZXJvWy0xM10sIGNzdW1tYXJ5X1BsYWNlbnRhX21hbGVfSVRVX24kbWVkaWFuX2N2bVstMTNdKQoKbnplcm9faW5kaWNlc19Db3JkIDwtIGRhdGEuZnJhbWUodChlbGJvd19maW5kZXIoY3N1bW1hcnlfUGxhY2VudGFfbWFsZV9JVFVfbiRuemVyb1stMTNdLCBjc3VtbWFyeV9QbGFjZW50YV9tYWxlX0lUVV9uJG1lZGlhbl9jdm1bLTEzXSkpKQpjb2xuYW1lcyhuemVyb19pbmRpY2VzX0NvcmQpIDwtIGMoIngiLCAieSIpCnJvd25hbWVzKG56ZXJvX2luZGljZXNfQ29yZCkgPC0gTlVMTApgYGAKYGBge3J9Cm56ZXJvX2ZpbmFsX3BsYWNlbnRhX21hbGUgPC0gNQpgYGAKCgpgYGB7cn0KY3N1bW1hcnlfUGxhY2VudGFfbWFsZV9JVFVfbltuemVybyAlaW4lIG56ZXJvX2ZpbmFsX3BsYWNlbnRhX21hbGVdCmBgYAoKCmBgYHtyfQpzdW1tYXJ5X1BsYWNlbnRhX21hbGVfSVRVX25fZmluYWxuemVybyA8LSBjc3VtbWFyeV9QbGFjZW50YV9tYWxlX0lUVV9uW256ZXJvICVpbiUgbnplcm9fZmluYWxfcGxhY2VudGFfbWFsZV0Kc2lnX3Zhcl9uYW1lc19QbGFjZW50YV9tYWxlX0lUVV9uX2ZpbmFsbnplcm8gPC0gRmlsdGVyKGZ1bmN0aW9uKHgpIGFueSh4ID4gMC43NSksIHN1bW1hcnlfUGxhY2VudGFfbWFsZV9JVFVfbl9maW5hbG56ZXJvWywhYygibnplcm8iLCAibWVhbl9jdm0iLCAibWVkaWFuX2N2bSIpXSkgJT4lIGNvbG5hbWVzKCkKY29sbmFtZXMoc3VtbWFyeV9QbGFjZW50YV9tYWxlX0lUVV9uX2ZpbmFsbnplcm8pIDwtIGMoIm5vbi16ZXJvIiwgImJpcnRoIHdlaWdodCIsICJiaXJ0aCBsZW5ndGgiLCAiaGVhZCBjaXJjdW1mZXJlbmNlIiwgImRlbGl2ZXJ5IG1vZGUgKGFpZGVkKSIsICJpbmR1Y2VkIGxhYm9yICh5ZXMpIiwgInBhcml0eSAoYmlydGggYmVmb3JlKSIsICJtYXRlcm5hbCBhZ2UiLCAibWF0ZXJuYWwgQk1JIiwgIm1hdGVybmFsIGh5cGVydGVuc2lvbiAoeWVzKSIsICJtYXRlcm5hbCBkaWFiZXRlcyAoeWVzKSIsICJtYXRlcm5hbCBtZW50YWwgZGlzb3JkZXJzICh5ZXMpIiwgIm1hdGVybmFsIHNtb2tpbmcgKHllcykiLCAibWVhbiBjdm0iLCAibWVkaWFuIGN2bSIpCnN1bW1hcnlfUGxhY2VudGFfbWFsZV9JVFVfbl9maW5hbG56ZXJvVCA8LSBhcy5kYXRhLmZyYW1lKHQoc3VtbWFyeV9QbGFjZW50YV9tYWxlX0lUVV9uX2ZpbmFsbnplcm9bLC1jKCJub24temVybyIsICJtZWRpYW4gY3ZtIiwgIm1lYW4gY3ZtIildKSkKc3VtbWFyeV9QbGFjZW50YV9tYWxlX0lUVV9uX2ZpbmFsbnplcm9UJHZhcmlhYmxlIDwtIHJvd25hbWVzKHN1bW1hcnlfUGxhY2VudGFfbWFsZV9JVFVfbl9maW5hbG56ZXJvVCkKcm93bmFtZXMoc3VtbWFyeV9QbGFjZW50YV9tYWxlX0lUVV9uX2ZpbmFsbnplcm9UKSA8LSBOVUxMCm5hbWVzKHN1bW1hcnlfUGxhY2VudGFfbWFsZV9JVFVfbl9maW5hbG56ZXJvVClbbmFtZXMoc3VtbWFyeV9QbGFjZW50YV9tYWxlX0lUVV9uX2ZpbmFsbnplcm9UKSA9PSAnVjEnXSA8LSAncGVyY2VudCcKc3VtbWFyeV9QbGFjZW50YV9tYWxlX0lUVV9uX2ZpbmFsbnplcm9UIDwtIHN1bW1hcnlfUGxhY2VudGFfbWFsZV9JVFVfbl9maW5hbG56ZXJvVFtvcmRlcihzdW1tYXJ5X1BsYWNlbnRhX21hbGVfSVRVX25fZmluYWxuemVyb1QkcGVyY2VudCksXQoKc3VtbWFyeV9QbGFjZW50YV9tYWxlX0lUVV9uX2ZpbmFsbnplcm9UJG51bWJlciA8LSBzZXEoMSwgbGVuZ3RoKHN1bW1hcnlfUGxhY2VudGFfbWFsZV9JVFVfbl9maW5hbG56ZXJvVCR2YXJpYWJsZSkpCmBgYAoKYGBge3IsIGZpZy53aWR0aD04fQpwZXJjX3ZhcnNfUGxhY2VudGFfbWFsZV9JVFVfbiA8LSAKICBnZ3Bsb3Qoc3VtbWFyeV9QbGFjZW50YV9tYWxlX0lUVV9uX2ZpbmFsbnplcm9ULCBhZXMocmVvcmRlcih2YXJpYWJsZSwgcGVyY2VudCksIHBlcmNlbnQsIGdyb3VwPTEpKSsKICBnZW9tX3BvaW50KCkrIGdlb21fbGluZSgpKwogIHlsYWIoIiUgb2NjdXJlbmNlIGluIG1vZGVscyB3aXRoIG56ZXJvIGNvZWZmaWNpZW50cyA9IDIiKSsKICBzY2FsZV95X2NvbnRpbnVvdXMoYnJlYWtzPWMoMC4xLDAuMiwwLjMsMC40LDAuNSwwLjYsMC43LDAuOCwwLjkpKSsKICB4bGFiKCJ2YXJpYWJsZSIpKwogIGNvb3JkX2ZsaXAoKSsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQ9MC43NSwgbGluZXR5cGU9ImRvdHRlZCIpKwogIHRoZW1lX2J3KCkKCnBlcmNfdmFyc19QbGFjZW50YV9tYWxlX0lUVV9uCgojIGRlY2lkZSBmb3IgY3V0LW9mZiAlIC0+IGhlcmUgLjc1CgpGaWx0ZXIoZnVuY3Rpb24oeCkgYW55KHggPiAwLjc1KSwgc3VtbWFyeV9QbGFjZW50YV9tYWxlX0lUVV9uX2ZpbmFsbnplcm9bLCFjKCJub24temVybyIsICJtZWFuIGN2bSIsICJtZWRpYW4gY3ZtIildKQoKYGBgCgpgYGB7cn0KcG5nKGZpbGVuYW1lPSJSZXN1bHRzL0ZpZ3VyZXMvZWxhc3RpY05ldF9zaW5nbGVUaXNzdWVzL091dGNvbWVfYWRkL3NleF9zcGxpdC92YXJzUGVyY2VudF9QbGFjZW50YV9tYWxlLnBuZyIsIHdpZHRoPTExMDAsIGhlaWdodD0xNDAwLCByZXM9MzAwKQpwZXJjX3ZhcnNfUGxhY2VudGFfbWFsZV9JVFVfbgpkZXYub2ZmKCkKYGBgCgoKYGBge3J9CnBtMl9QbGFjZW50YV9tYWxlX0lUVV9uX2NvZWYgPC0KICBkY2FzdChwbTJfUGxhY2VudGFfbWFsZV9JVFVfblssCiAgICAgICAgICAgICAgICAgICAgICAgYXMubGlzdCh1bmxpc3QoCiAgICAgICAgICAgICAgICAgICAgICAgICBsYXBwbHkoLlNELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uKHgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHkgPC0gdW5uYW1lKHF1YW50aWxlKHhbeCAhPSAwXSwgcHJvYnMgPSBjKDAuMDI1LCAwLjk3NSkpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdCgibm9uX3plcm8iID0gMTAwICogbWVhbih4ICE9IDApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsY2wgPSB5WzFdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1Y2wgPSB5WzJdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aCA9IGRpZmYoeSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhbiA9IG1lZGlhbih4W3ghPSAwXSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpKSwKICAgICAgICAgICAgICAgICAgICAgICAuU0Rjb2xzID0gYygiQ2hpbGRfQmlydGhfV2VpZ2h0IiwgIkNoaWxkX0JpcnRoX0xlbmd0aCIsICJDaGlsZF9IZWFkX0NpcmN1bWZlcmVuY2VfQXRfQmlydGgiLCAiRGVsaXZlcnlfbW9kZV9kaWNob3RvbWFpZGVkIiwgIkluZHVjZWRfTGFib3VyeWVzIiwgIlBhcml0eV9kaWNob3RvbWdpdmVuIGJpcnRoIGJlZm9yZSIsICJNYXRlcm5hbF9BZ2VfWWVhcnMiLCAiTWF0ZXJuYWxfQm9keV9NYXNzX0luZGV4X2luX0Vhcmx5X1ByZWduYW5jeSIsICJNYXRlcm5hbF9IeXBlcnRlbnNpb25fZGljaG90b21oeXBlcnRlbnNpb24gaW4gY3VycmVudCBwcmVnbmFuY3kiLCAiTWF0ZXJuYWxfRGlhYmV0ZXNfZGljaG90b21kaWFiZXRlcyBpbiBjdXJyZW50IHByZWduYW5jeSIsICJNYXRlcm5hbF9NZW50YWxfRGlzb3JkZXJzWWVzIiwgInNtb2tpbmdfZGljaG90b215ZXMiKSwKICAgICAgICAgICAgICAgICAgICAgICBieSA9IG56ZXJvXVtvcmRlcihuemVybyldICU+JQogICAgICAgICAgbWVsdChpZC52YXIgPSAibnplcm8iKSAlPiUKICAgICAgICAgIC5bLCBtZXRyaWMgOj0gc3ViKCJeLitcXC4oLispJCIsICJcXDEiLCB2YXJpYWJsZSldICU+JQogICAgICAgICAgLlssIHZhcmlhYmxlIDo9IHN1YigiXiguKylcXC4uKyQiLCAiXFwxIiwgdmFyaWFibGUpXSAlPiUKICAgICAgICAgIC5bbnplcm8gPT1uemVyb19maW5hbF9wbGFjZW50YV9tYWxlXSwgbnplcm8rIHZhcmlhYmxlIH4gbWV0cmljLCB2YWx1ZS52YXI9InZhbHVlIikKCiMgZ2V0IGRlc2lyZWQgb3JkZXIgb2YgcHJlZGljdG9ycwpwbTJfUGxhY2VudGFfbWFsZV9JVFVfbl9jb2VmIDwtCiAgcG0yX1BsYWNlbnRhX21hbGVfSVRVX25fY29lZlttYXRjaChjKCJDaGlsZF9CaXJ0aF9XZWlnaHQiLCAiQ2hpbGRfQmlydGhfTGVuZ3RoIiwgIkNoaWxkX0hlYWRfQ2lyY3VtZmVyZW5jZV9BdF9CaXJ0aCIsICJEZWxpdmVyeV9tb2RlX2RpY2hvdG9tYWlkZWQiLCAiSW5kdWNlZF9MYWJvdXJ5ZXMiLCAiUGFyaXR5X2RpY2hvdG9tZ2l2ZW4gYmlydGggYmVmb3JlIiwgIk1hdGVybmFsX0FnZV9ZZWFycyIsICJNYXRlcm5hbF9Cb2R5X01hc3NfSW5kZXhfaW5fRWFybHlfUHJlZ25hbmN5IiwgIk1hdGVybmFsX0h5cGVydGVuc2lvbl9kaWNob3RvbWh5cGVydGVuc2lvbiBpbiBjdXJyZW50IHByZWduYW5jeSIsICJNYXRlcm5hbF9EaWFiZXRlc19kaWNob3RvbWRpYWJldGVzIGluIGN1cnJlbnQgcHJlZ25hbmN5IiwgIk1hdGVybmFsX01lbnRhbF9EaXNvcmRlcnNZZXMiLCAic21va2luZ19kaWNob3RvbXllcyIpLCBwbTJfUGxhY2VudGFfbWFsZV9JVFVfbl9jb2VmJHZhcmlhYmxlKSxdCnBtMl9QbGFjZW50YV9tYWxlX0lUVV9uX2NvZWYkdmFyaWFibGUgPC0gZmFjdG9yKHBtMl9QbGFjZW50YV9tYWxlX0lUVV9uX2NvZWYkdmFyaWFibCwgbGV2ZWxzPXVuaXF1ZShwbTJfUGxhY2VudGFfbWFsZV9JVFVfbl9jb2VmJHZhcmlhYmxlKSkKCgpgYGAKCmBgYHtyfQpzaWdfdmFyc19QbGFjZW50YV9tYWxlX0lUVV9uIDwtCiAgcG0yX1BsYWNlbnRhX21hbGVfSVRVX25fY29lZiAlPiUKICBnZ3Bsb3QyOjpnZ3Bsb3QoLikgKwogIGdncGxvdDI6OnRoZW1lX2J3KCkgKwogIGdncGxvdDI6OnRoZW1lKGF4aXMudGV4dC54PWVsZW1lbnRfYmxhbmsoKSkrCiAgZ2dwbG90Mjo6YWVzKHg9Im56ZXJvIikrCiAgZ2dwbG90Mjo6Z2VvbV9wb2ludChtYXBwaW5nID0gZ2dwbG90Mjo6YWVzKHkgPSB2YXJpYWJsZSwgc2l6ZSA9bm9uX3plcm8sIGFscGhhID0gbm9uX3plcm8sIGNvbG9yID0gbm9uX3plcm8pKSArCiAgZ2dwbG90Mjo6Z2VvbV90ZXh0KGFlcyh5PXZhcmlhYmxlLCBsYWJlbD1zcHJpbnRmKCIlMC4yZiIsIHJvdW5kKG1lZGlhbiwgZGlnaXRzPTIpKSwgc2l6ZT01MCksaGp1c3Q9MCwgdmp1c3Q9MC41LCBudWRnZV94ID0gMC4xKSsKICBnZ3Bsb3QyOjpzY2FsZV9jb2xvcl9ncmFkaWVudDIoaGlnaCA9ICdncmVlbicsIG1pZCA9ICJwdXJwbGUiLCBsb3cgPSAiYmxhY2siLCBtaWRwb2ludCA9NTApKwogIGdncGxvdDI6OnNjYWxlX2FscGhhKGd1aWRlID0gJ25vbmUnKSsKICBnZ3Bsb3QyOjpzY2FsZV9zaXplKGd1aWRlID0gJ25vbmUnKSsKICBnZ3Bsb3QyOjpzY2FsZV95X2Rpc2NyZXRlKGxhYmVscz0gYygiYmlydGggd2VpZ2h0IiwgImJpcnRoIGxlbmd0aCIsICJoZWFkIGNpcmN1bWZlcmVuY2UiLCAiZGVsaXZlcnkgbW9kZSAoYWlkZWQpIiwgImluZHVjZWQgbGFib3IgKHllcykiLCAicGFyaXR5IChiaXJ0aCBiZWZvcmUpIiwgIm1hdGVybmFsIGFnZSIsICJtYXRlcm5hbCBCTUkiLCAibWF0ZXJuYWwgaHlwZXJ0ZW5zaW9uICh5ZXMpIiwgIm1hdGVybmFsIGRpYWJldGVzICh5ZXMpIiwgIm1hdGVybmFsIG1lbnRhbCBkaXNvcmRlcnMgKHllcykiLCAibWF0ZXJuYWwgc21va2luZyAoeWVzKSIpKSsKICBnZ3Bsb3QyOjpsYWJzKHk9InByZWRpY3RvciIsIHggPSAibnVtYmVyIG9mIG5vbi16ZXJvIGNvZWZmaWNpZW50cyA9IDIiLCBjb2xvcj0iJSIpCgpgYGAKCmBgYHtyfQpjb2VmX1BsYWNlbnRhX21hbGVfSVRVX24gPC0gCiAgZ2dwbG90KHBtMl9QbGFjZW50YV9tYWxlX0lUVV9uX2NvZWYsIGFlcyh5ID0gdmFyaWFibGUsIHg9bWVkaWFuKSkrCiAgZ2VvbV9wb2ludChtYXBwaW5nID0gZ2dwbG90Mjo6YWVzKHkgPSB2YXJpYWJsZSwgc2l6ZSA9bm9uX3plcm8sIGFscGhhID0gbm9uX3plcm8sIGNvbG9yID0gbm9uX3plcm8pKSsKICBzY2FsZV9jb2xvcl9ncmFkaWVudDIoaGlnaCA9ICdncmVlbicsIG1pZCA9ICJwdXJwbGUiLCBsb3cgPSAiYmxhY2siLCBtaWRwb2ludCA9NTAsIGxpbWl0cz1jKDAsMTAwKSkrCiAgc2NhbGVfYWxwaGEoZ3VpZGUgPSAnbm9uZScpKwogIHNjYWxlX3NpemUoZ3VpZGUgPSAnbm9uZScpKwogIGdlb21fcG9pbnQoKSsKICBnZW9tX2Vycm9yYmFyKGFlcyh5ID0gdmFyaWFibGUsIHhtaW4gPSBsY2wsIHhtYXggPSB1Y2wpLCB3aWR0aCA9IDAuMikrCiAgbGFicyh5PSJwcmVkaWN0b3IiLCB4ID0gIlxubWVkaWFuICYgOTUlIENJIG9mIGNvZWZmaWNpZW50IChvdmVyIGJvb3RzdHJhcHMpIiwgY29sb3I9IiUiKSsKICBzY2FsZV94X2NvbnRpbnVvdXMobGltaXRzPWMoLTAuNCwwLjQpLCBicmVha3M9YygtLjQsLS4zLC0uMiwgLS4xLCAwLCAuMSwgLjIsIC4zLCAuNCkpKwogIHNjYWxlX3lfZGlzY3JldGUobGFiZWxzPSBjKCJiaXJ0aCB3ZWlnaHQiLCAiYmlydGggbGVuZ3RoIiwgImhlYWQgY2lyY3VtZmVyZW5jZSIsICJkZWxpdmVyeSBtb2RlIChhaWRlZCkiLCAiaW5kdWNlZCBsYWJvciAoeWVzKSIsICJwYXJpdHkgKGJpcnRoIGJlZm9yZSkiLCAibWF0ZXJuYWwgYWdlIiwgIm1hdGVybmFsIEJNSSIsICJtYXRlcm5hbCBoeXBlcnRlbnNpb24gKHllcykiLCAibWF0ZXJuYWwgZGlhYmV0ZXMgKHllcykiLCAibWF0ZXJuYWwgbWVudGFsIGRpc29yZGVycyAoeWVzKSIsICJtYXRlcm5hbCBzbW9raW5nICh5ZXMpIikpKwogIGdlb21fdmxpbmUoeGludGVyY2VwdD0wLCBsaW5ldHlwZT0iZGFzaGVkIikrCiAgdGhlbWVfYncoKSsKICB0aGVtZSh0ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNSksIGF4aXMudGl0bGUueD0gZWxlbWVudF90ZXh0KHNpemU9MTUpLCBheGlzLnRpdGxlLnk9IGVsZW1lbnRfdGV4dChzaXplPTE1KSkKCgpjb2VmX1BsYWNlbnRhX21hbGVfSVRVX24KYGBgCgpgYGB7cn0KcG5nKGZpbGVuYW1lPSJSZXN1bHRzL0ZpZ3VyZXMvZWxhc3RpY05ldF9zaW5nbGVUaXNzdWVzL091dGNvbWVfYWRkL3NleF9zcGxpdC9jb2VmX1BsYWNlbnRhX21hbGUucG5nIiwgd2lkdGg9MjgwMCwgaGVpZ2h0PTE0MDAsIHJlcz00MDApCmNvZWZfUGxhY2VudGFfbWFsZV9JVFVfbgpkZXYub2ZmKCkKYGBgCgpgYGB7cn0KcDEgPC0KICBjc3VtbWFyeV9QbGFjZW50YV9tYWxlX0lUVV9uICU+JQogIG1lbHQoaWQudmFycyA9IGMoIm56ZXJvIiwgIm1lYW5fY3ZtIiwgIm1lZGlhbl9jdm0iKSkgJT4lCiAgZ2dwbG90Mjo6Z2dwbG90KC4pICsKICBnZ3Bsb3QyOjp0aGVtZV9idygpICsKICBnZ3Bsb3QyOjphZXMoeCA9IG56ZXJvKSArCiAgZ2dwbG90Mjo6Z2VvbV9wb2ludChtYXBwaW5nID0gZ2dwbG90Mjo6YWVzKHkgPSB2YXJpYWJsZSwgc2l6ZSA9IHZhbHVlLCBhbHBoYSA9IHZhbHVlLCBjb2xvciA9IHZhbHVlKjEwMCkpICsKICBnZ3Bsb3QyOjpzY2FsZV9jb2xvcl9ncmFkaWVudDIoaGlnaCA9ICdncmVlbicsIG1pZCA9ICJwdXJwbGUiLCBsb3cgPSAiYmxhY2siLCBtaWRwb2ludCA9NTApKwogIGdncGxvdDI6OnNjYWxlX2FscGhhKGd1aWRlID0gJ25vbmUnKSsKICBnZ3Bsb3QyOjpzY2FsZV9zaXplKGd1aWRlID0gJ25vbmUnKSsKICBnZ3Bsb3QyOjpzY2FsZV95X2Rpc2NyZXRlKGxhYmVscz0gYygiYmlydGggd2VpZ2h0IiwgImJpcnRoIGxlbmd0aCIsICJoZWFkIGNpcmN1bWZlcmVuY2UiLCAiZGVsaXZlcnkgbW9kZSAoYWlkZWQpIiwgImluZHVjZWQgbGFib3IgKHllcykiLCAicGFyaXR5IChiaXJ0aCBiZWZvcmUpIiwgIm1hdGVybmFsIGFnZSIsICJtYXRlcm5hbCBCTUkiLCAibWF0ZXJuYWwgaHlwZXJ0ZW5zaW9uICh5ZXMpIiwgIm1hdGVybmFsIGRpYWJldGVzICh5ZXMpIiwgIm1hdGVybmFsIG1lbnRhbCBkaXNvcmRlcnMgKHllcykiLCAibWF0ZXJuYWwgc21va2luZyAoeWVzKSIpKSsKICBnZ3Bsb3QyOjpzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzPTA6MTQsIGxhYmVscz0pKwogIGdncGxvdDI6OmxhYnMoeT0icHJlZGljdG9yIiwgeCA9ICJcbm51bWJlciBvZiBub24temVybyBjb2VmZmljaWVudHMiLCBjb2xvcj0iJSIpKwogIGdncGxvdDI6OnRoZW1lKHRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE3KSwgYXhpcy50aXRsZS54PSBlbGVtZW50X3RleHQoc2l6ZT0xNSksIGF4aXMudGl0bGUueT0gZWxlbWVudF90ZXh0KHNpemU9MTUpLCBsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpCiAgCnAyIDwtIAogIGdncGxvdChwbTJfUGxhY2VudGFfbWFsZV9JVFVfbl9jb2VmLCBhZXMoeSA9IHZhcmlhYmxlLCB4PW1lZGlhbikpKwogIGdlb21fcG9pbnQobWFwcGluZyA9IGdncGxvdDI6OmFlcyh5ID0gdmFyaWFibGUsIHNpemUgPW5vbl96ZXJvLCBhbHBoYSA9IG5vbl96ZXJvLCBjb2xvciA9IG5vbl96ZXJvKSkrCiAgc2NhbGVfY29sb3JfZ3JhZGllbnQyKGhpZ2ggPSAnZ3JlZW4nLCBtaWQgPSAicHVycGxlIiwgbG93ID0gImJsYWNrIiwgbWlkcG9pbnQgPTUwLCBsaW1pdHM9YygwLDEwMCkpKwogIHNjYWxlX2FscGhhKGd1aWRlID0gJ25vbmUnKSsKICBzY2FsZV9zaXplKGd1aWRlID0gJ25vbmUnKSsKICBnZW9tX3BvaW50KCkrCiAgZ2VvbV9lcnJvcmJhcihhZXMoeSA9IHZhcmlhYmxlLCB4bWluID0gbGNsLCB4bWF4ID0gdWNsKSwgd2lkdGggPSAwLjIpKwogIGxhYnMoeT0iIiwgeCA9ICJcbm1lZGlhbiAmIDk1JSBDSSBvZiBjb2VmZmljaWVudCAob3ZlciBib290c3RyYXBzKSIsIGNvbG9yPSIlIikrCiAgc2NhbGVfeF9jb250aW51b3VzKGxpbWl0cz1jKC0wLjQsMC40KSwgYnJlYWtzPWMoLS40LC0uMywtLjIsIC0uMSwgMCwgLjEsIC4yLCAuMywgLjQpKSsKICBzY2FsZV95X2Rpc2NyZXRlKGxhYmVscz0gYygiYmlydGggd2VpZ2h0IiwgImJpcnRoIGxlbmd0aCIsICJoZWFkIGNpcmN1bWZlcmVuY2UiLCAiZGVsaXZlcnkgbW9kZSAoYWlkZWQpIiwgImluZHVjZWQgbGFib3IgKHllcykiLCAicGFyaXR5IChiaXJ0aCBiZWZvcmUpIiwgIm1hdGVybmFsIGFnZSIsICJtYXRlcm5hbCBCTUkiLCAibWF0ZXJuYWwgaHlwZXJ0ZW5zaW9uICh5ZXMpIiwgIm1hdGVybmFsIGRpYWJldGVzICh5ZXMpIiwgIm1hdGVybmFsIG1lbnRhbCBkaXNvcmRlcnMgKHllcykiLCAibWF0ZXJuYWwgc21va2luZyAoeWVzKSIpKSsKICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQ9MCwgbGluZXR5cGU9ImRhc2hlZCIpKwogIHRoZW1lX2J3KCkrCiAgZ2d0aXRsZSgibnplcm8gPSA1IikrCiAgdGhlbWUodGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0xNyksIGF4aXMudGl0bGUueD0gZWxlbWVudF90ZXh0KHNpemU9MTUpLCBheGlzLnRpdGxlLnk9IGVsZW1lbnRfdGV4dChzaXplPTE1KSwgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplPTE1KSwgYXhpcy50ZXh0Lnk9ZWxlbWVudF9ibGFuaygpKQoKZzEgPC0gZ2dwbG90R3JvYihwMSkKZzIgPC0gZ2dwbG90R3JvYihwMikKZyA8LSBjYmluZChnMSwgZzIsIHNpemUgPSAibGFzdCIpCmckaGVpZ2h0cyA8LSB1bml0LnBtYXgoZzEkaGVpZ2h0cywgZzIkaGVpZ2h0cykKCnBuZyhmaWxlbmFtZT0iUmVzdWx0cy9GaWd1cmVzL2VsYXN0aWNOZXRfc2luZ2xlVGlzc3Vlcy9PdXRjb21lX2FkZC9zZXhfc3BsaXQvTW9kZWxfY29lZl9QbGFjZW50YV9tYWxlLnBuZyIsIHdpZHRoPTU4MDAsIGhlaWdodD0xNjAwLCByZXM9NDAwKQpncmlkLmRyYXcoZykKZGV2Lm9mZigpCmBgYAoKW3RvIHRoZSB0b3BdKCN0b3ApCgojIyMgZmVtYWxlcwogIApgYGB7cn0KIyBpbiBjYXNlIHlvdSB3YW50IHRvIHN0YXJ0IGZyb20gaGVyZQpsb2FkKCJJbnB1dERhdGEvQ2xvY2tDYWxjdWxhdGlvbnNJbnB1dC9SZWdfSW5wdXRfRGF0YV9QbGFjZW50YV9mZW1hbGVfSVRVX0VBQVJfbm9OYV9uLlJkYXRhIikKUmVnX0lucHV0X0RhdGFfUGxhY2VudGFfZmVtYWxlX0lUVV9FQUFSX25vTmFfbiRDaGlsZF9TZXggPC0gTlVMTApgYGAKCgpgYGB7cn0KeXJjX21hdF9JVFVfUGxhY2VudGFfZmVtYWxlX24gPC0gbWF0cml4KFJlZ19JbnB1dF9EYXRhX1BsYWNlbnRhX2ZlbWFsZV9JVFVfRUFBUl9ub05hX24kRUFBUl9MZWUpCnhyY19tYXRfSVRVX1BsYWNlbnRhX2ZlbWFsZV9uIDwtIG1vZGVsLm1hdHJpeCggfiAuIC0gRUFBUl9MZWUsIGRhdGEgPSBSZWdfSW5wdXRfRGF0YV9QbGFjZW50YV9mZW1hbGVfSVRVX0VBQVJfbm9OYV9uKVssIC0xXQp5cmNfbWF0X0lUVV9zY2FsZWRfUGxhY2VudGFfZmVtYWxlX24gPC0gc2NhbGUoeXJjX21hdF9JVFVfUGxhY2VudGFfZmVtYWxlX24pCnhyY19tYXRfSVRVX3NjYWxlZF9QbGFjZW50YV9mZW1hbGVfbiA8LSBzY2FsZSh4cmNfbWF0X0lUVV9QbGFjZW50YV9mZW1hbGVfbikKYGBgCgo8IS0tIHNldCBzZWVkIC0tPgo8IS0tIGBgYHtyfSAtLT4KPCEtLSBzZXQuc2VlZCgyMDIwKSAtLT4KPCEtLSBgYGAgLS0+CgoKPCEtLSBgYGB7ciwgd2FybmluZz1GfSAtLT4KPCEtLSAgIG5ib290ID0gMTAwMCAtLT4KCjwhLS0gICBzdGFydF90aW1lIDwtIFN5cy50aW1lKCkgLS0+CjwhLS0gICBib290c3RyYXBzX1BsYWNlbnRhX2ZlbWFsZV9JVFVfbiA8LSByZXBsaWNhdGUobmJvb3QsIHsgLS0+CjwhLS0gICAgIHJ3cyA8LSBzYW1wbGUoMTpucm93KHhyY19tYXRfSVRVX3NjYWxlZF9QbGFjZW50YV9mZW1hbGVfbiksIHJlcGxhY2UgPSBUUlVFKSAtLT4KPCEtLSAgICAgZW5zcih4cmNfbWF0X0lUVV9zY2FsZWRfUGxhY2VudGFfZmVtYWxlX25bcndzLCBdLCB5cmNfbWF0X0lUVV9zY2FsZWRfUGxhY2VudGFfZmVtYWxlX25bcndzLCBdLCBzdGFuZGFyZGl6ZWQgPSBGQUxTRSwgZmFtaWx5PSJnYXVzc2lhbiIsIG5sYW1iZGE9MTAwLCBuZm9sZHM9MTAsIGFscGhhPWMoMC4wLDAuMSwwLjIsMC4zLDAuNCwwLjUsMC42LDAuNywwLjgsMC45LDEuMCkpIC0tPgo8IS0tICAgfSwgLS0+CjwhLS0gICBzaW1wbGlmeSA9IEZBTFNFKSAtLT4KCjwhLS0gICBlbmRfdGltZSA8LSBTeXMudGltZSgpIC0tPgo8IS0tICAgZW5kX3RpbWUgLSBzdGFydF90aW1lIC0tPgoKPCEtLSBgYGAgLS0+Cgo8IS0tIGBgYHtyfSAtLT4KPCEtLSBzYXZlKGJvb3RzdHJhcHNfUGxhY2VudGFfZmVtYWxlX0lUVV9uLCBmaWxlPSJJbnB1dERhdGEvRGF0YV9FbGFzdGljTmV0cy9ib290c3RyYXBzX1BsYWNlbnRhX2ZlbWFsZV9JVFVfbl8xMDAwLlJkYXRhIikgLS0+CjwhLS0gYGBgIC0tPgoKCmBgYHtyfQpsb2FkKCJJbnB1dERhdGEvRGF0YV9FbGFzdGljTmV0cy9ib290c3RyYXBzX1BsYWNlbnRhX2ZlbWFsZV9JVFVfbl8xMDAwLlJkYXRhIikKYGBgCgoKYGBge3J9CnN1bW1hcmllc19QbGFjZW50YV9mZW1hbGVfSVRVX24gPC0KICBib290c3RyYXBzX1BsYWNlbnRhX2ZlbWFsZV9JVFVfbiAlPiUKICBsYXBwbHkoc3VtbWFyeSkgJT4lCiAgcmJpbmRsaXN0KGlkY29sID0gImJvb3RzdHJhcCIpCgpzdW1tYXJpZXNfUGxhY2VudGFfZmVtYWxlX0lUVV9uCmBgYAoKYGBge3J9CnBuZyhmaWxlbmFtZT0iUmVzdWx0cy9GaWd1cmVzL2VsYXN0aWNOZXRfc2luZ2xlVGlzc3Vlcy9PdXRjb21lX2FkZC9zZXhfc3BsaXQvYm9vdHN0cmFwc19QbGFjZW50YV9GRU1BTEUucG5nIiwgd2lkdGg9ODAwLCBoZWlnaHQ9NjAwKQpzdW1tYXJpZXNfUGxhY2VudGFfZmVtYWxlX0lUVV9uWywgLlNEW2N2bSA9PSBtaW4oY3ZtKV0sIGJ5ID0gYygiYm9vdHN0cmFwIiwgIm56ZXJvIildICU+JQogIGdncGxvdDI6OmdncGxvdChkYXRhID0gLikgKwogIGdncGxvdDI6OmFlcyh4ID0gbnplcm8sIHkgPSBjdm0sIGdyb3VwID0gYm9vdHN0cmFwKSArCiAgZ2dwbG90Mjo6Z2VvbV9wb2ludCgpICsKICBnZ3Bsb3QyOjpnZW9tX2xpbmUoKQpkZXYub2ZmKCkKYGBgCgoKPCEtLSBgYGB7ciwgd2FybmluZz1GQUxTRX0gLS0+CjwhLS0gIyBsb3dlc3QgY3ZtIGJ5IGJvb3RzdHJhcCBhbmQgbnplcm8gLS0+CjwhLS0gcG1fUGxhY2VudGFfZmVtYWxlX0lUVV9uIDwtIHN1bW1hcmllc19QbGFjZW50YV9mZW1hbGVfSVRVX25bLCAuU0RbY3ZtID09IG1pbihjdm0pXSwgYnkgPSBjKCJib290c3RyYXAiLCAibnplcm8iKV0gLS0+CjwhLS0gcG0yX1BsYWNlbnRhX2ZlbWFsZV9JVFVfbiA8LSBOVUxMIC0tPgoKPCEtLSBmb3IoaSBpbiBhcy5pbnRlZ2VyKHNlcSgxLCBucm93KHBtX1BsYWNlbnRhX2ZlbWFsZV9JVFVfbiksIGJ5ID0gMSkpKSB7IC0tPgo8IS0tICAgcG0yX1BsYWNlbnRhX2ZlbWFsZV9JVFVfbiA8LSByYmluZChwbTJfUGxhY2VudGFfZmVtYWxlX0lUVV9uLCAtLT4KPCEtLSAgICAgICAgICAgICAgICBjYmluZChwbV9QbGFjZW50YV9mZW1hbGVfSVRVX25baSwgXSwgLS0+CjwhLS0gICAgICAgICAgICAgICAgdChhcy5tYXRyaXgoY29lZihib290c3RyYXBzX1BsYWNlbnRhX2ZlbWFsZV9JVFVfbltbcG1fUGxhY2VudGFfZmVtYWxlX0lUVV9uW2ksIGJvb3RzdHJhcF1dXVtbcG1fUGxhY2VudGFfZmVtYWxlX0lUVV9uW2ksIGxfaW5kZXhdXV0sIHMgPSBwbV9QbGFjZW50YV9mZW1hbGVfSVRVX25baSwgbGFtYmRhXSkpKSAtLT4KPCEtLSAgICAgICAgICAgICAgICApIC0tPgo8IS0tICAgKSAtLT4KPCEtLSB9IC0tPgoKPCEtLSBwbTJfUGxhY2VudGFfZmVtYWxlX0lUVV9uIC0tPgo8IS0tIGBgYCAtLT4KCgo8IS0tIGBgYHtyfSAtLT4KPCEtLSAjIHNhdmUgInByZWZlcmFibGUgbW9kZWxzIiAtLT4KPCEtLSBzYXZlKHBtMl9QbGFjZW50YV9mZW1hbGVfSVRVX24sIGZpbGU9IklucHV0RGF0YS9EYXRhX0VsYXN0aWNOZXRzL3BtMl9QbGFjZW50YV9mZW1hbGVfSVRVX24uUmRhdGEiKSAtLT4KPCEtLSBgYGAgLS0+CgoKYGBge3J9CmxvYWQoIklucHV0RGF0YS9EYXRhX0VsYXN0aWNOZXRzL3BtMl9QbGFjZW50YV9mZW1hbGVfSVRVX24uUmRhdGEiKQojIGNvZWZmaWNpZW50IHZhbHVlcyBmb3IgdGhlIG1vZGVscyB3aXRoIHNtYWxsZXN0IGN2bSBieSBudW1iZXIgb2Ygbm9uLWVyem8gY29lZmZpY2llbnRzIGFuZCBib290c3RyYXAKYGBgCgoKYGBge3J9CmNzdW1tYXJ5X1BsYWNlbnRhX2ZlbWFsZV9JVFVfbiA8LSBSZWR1Y2UoZnVuY3Rpb24oeCx5KSBtZXJnZSh4ID0geCwgeSA9IHksIGJ5ID0gIm56ZXJvIiksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0KHBtMl9QbGFjZW50YV9mZW1hbGVfSVRVX25bLCBsYXBwbHkoLlNELCBmdW5jdGlvbih4KSB7bWVhbih4ICE9IDApfSksIC5TRGNvbHMgPSBjKCJDaGlsZF9CaXJ0aF9XZWlnaHQiLCAiQ2hpbGRfQmlydGhfTGVuZ3RoIiwgIkNoaWxkX0hlYWRfQ2lyY3VtZmVyZW5jZV9BdF9CaXJ0aCIsICJEZWxpdmVyeV9tb2RlX2RpY2hvdG9tYWlkZWQiLCAiSW5kdWNlZF9MYWJvdXJ5ZXMiLCAiUGFyaXR5X2RpY2hvdG9tZ2l2ZW4gYmlydGggYmVmb3JlIiwgIk1hdGVybmFsX0FnZV9ZZWFycyIsICJNYXRlcm5hbF9Cb2R5X01hc3NfSW5kZXhfaW5fRWFybHlfUHJlZ25hbmN5IiwgIk1hdGVybmFsX0h5cGVydGVuc2lvbl9kaWNob3RvbWh5cGVydGVuc2lvbiBpbiBjdXJyZW50IHByZWduYW5jeSIsICJNYXRlcm5hbF9EaWFiZXRlc19kaWNob3RvbWRpYWJldGVzIGluIGN1cnJlbnQgcHJlZ25hbmN5IiwgIk1hdGVybmFsX01lbnRhbF9EaXNvcmRlcnNZZXMiLCAic21va2luZ19kaWNob3RvbXllcyIpLCBieSA9IG56ZXJvXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbTJfUGxhY2VudGFfZmVtYWxlX0lUVV9uWywgLihtZWFuX2N2bSA9IG1lYW4oY3ZtKSksIGJ5ID0gbnplcm9dLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBtMl9QbGFjZW50YV9mZW1hbGVfSVRVX25bLCAuKG1lZGlhbl9jdm0gPSBtZWRpYW4oY3ZtKSksIGJ5ID0gbnplcm9dCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkpW29yZGVyKG56ZXJvKV0KCmNzdW1tYXJ5X1BsYWNlbnRhX2ZlbWFsZV9JVFVfbgpgYGAKCgpgYGB7cn0KZzFfUGxhY2VudGFfZmVtYWxlX0lUVV9uIDwtCiAgY3N1bW1hcnlfUGxhY2VudGFfZmVtYWxlX0lUVV9uICU+JQogIG1lbHQoaWQudmFycyA9IGMoIm56ZXJvIiwgIm1lYW5fY3ZtIiwgIm1lZGlhbl9jdm0iKSkgJT4lCiAgZ2dwbG90Mjo6Z2dwbG90KC4pICsKICBnZ3Bsb3QyOjp0aGVtZV9idygpICsKICBnZ3Bsb3QyOjphZXMoeCA9IG56ZXJvKSArCiAgZ2dwbG90Mjo6Z2VvbV9wb2ludChtYXBwaW5nID0gZ2dwbG90Mjo6YWVzKHkgPSB2YXJpYWJsZSwgc2l6ZSA9IHZhbHVlLCBhbHBoYSA9IHZhbHVlLCBjb2xvciA9IHZhbHVlKjEwMCkpICsKICBnZ3Bsb3QyOjpzY2FsZV9jb2xvcl9ncmFkaWVudDIoaGlnaCA9ICdncmVlbicsIG1pZCA9ICJwdXJwbGUiLCBsb3cgPSAiYmxhY2siLCBtaWRwb2ludCA9NTApKwogIGdncGxvdDI6OnNjYWxlX2FscGhhKGd1aWRlID0gJ25vbmUnKSsKICBnZ3Bsb3QyOjpzY2FsZV9zaXplKGd1aWRlID0gJ25vbmUnKSsKICBnZ3Bsb3QyOjpzY2FsZV95X2Rpc2NyZXRlKGxhYmVscz0gYygiYmlydGggd2VpZ2h0IiwgImJpcnRoIGxlbmd0aCIsICJoZWFkIGNpcmN1bWZlcmVuY2UiLCAiZGVsaXZlcnkgbW9kZSIsICJpbmR1Y2VkIGxhYm9yIiwgInBhcml0eSIsICJtYXRlcm5hbCBhZ2UiLCAibWF0ZXJuYWwgQk1JIiwgIm1hdGVybmFsIGh5cGVydGVuc2lvbiIsICJtYXRlcm5hbCBkaWFiZXRlcyIsICJtYXRlcm5hbCBtZW50YWwgZGlzb3JkZXJzIiwgIm1hdGVybmFsIHNtb2tpbmciKSkrCiAgZ2dwbG90Mjo6c2NhbGVfeF9jb250aW51b3VzKGJyZWFrcz0wOjE0LCBsYWJlbHM9KSsKICBnZ3Bsb3QyOjpsYWJzKHk9InByZWRpY3RvciIsIHggPSAibnVtYmVyIG9mIG5vbi16ZXJvIGNvZWZmaWNpZW50cyIsIGNvbG9yPSIlIikrCiAgZ2dwbG90Mjo6dGhlbWUodGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTUpLCBheGlzLnRpdGxlLng9IGVsZW1lbnRfdGV4dChzaXplPTE1KSwgYXhpcy50aXRsZS55PSBlbGVtZW50X3RleHQoc2l6ZT0xNSkpCiAgCgpnMl9QbGFjZW50YV9mZW1hbGVfSVRVX24gPC0KICBjc3VtbWFyeV9QbGFjZW50YV9mZW1hbGVfSVRVX24gJT4lCiAgZ2dwbG90Mjo6Z2dwbG90KC4pICsKICBnZ3Bsb3QyOjp0aGVtZV9idygpICsKICBnZ3Bsb3QyOjphZXMoeCA9IG56ZXJvLCB5ID0gbWVkaWFuX2N2bSkgKwogIGdncGxvdDI6Omdlb21fcG9pbnQoKSArIGdncGxvdDI6Omdlb21fbGluZSgpKwogIGdncGxvdDI6OmxhYnMoeT0ibWVkaWFuIGN2bSIsIHggPSAibnVtYmVyIG9mIG5vbi16ZXJvIGNvZWZmaWNpZW50cyIpKwogIGdncGxvdDI6OnNjYWxlX3hfY29udGludW91cyhicmVha3M9MDoxNCwgbGFiZWxzPSkrCiAgZ2dwbG90Mjo6dGhlbWUoYXhpcy50ZXh0PWVsZW1lbnRfdGV4dChzaXplPTE1KSxheGlzLnRpdGxlPWVsZW1lbnRfdGV4dChzaXplPTE4KSkKCmdyaWRFeHRyYTo6Z3JpZC5hcnJhbmdlKGcxX1BsYWNlbnRhX2ZlbWFsZV9JVFVfbiwgZzJfUGxhY2VudGFfZmVtYWxlX0lUVV9uLCBuY29sID0gMSkKCmBgYAoKYGBge3J9CnBuZyhmaWxlbmFtZT0iUmVzdWx0cy9GaWd1cmVzL2VsYXN0aWNOZXRfc2luZ2xlVGlzc3Vlcy9PdXRjb21lX2FkZC9zZXhfc3BsaXQvTW9kZWxfUGxhY2VudGFfZmVtYWxlLnBuZyIsIHdpZHRoPTI4MDAsIGhlaWdodD0xNDAwLCByZXM9NDAwKQpnMV9QbGFjZW50YV9mZW1hbGVfSVRVX24KZGV2Lm9mZigpCmBgYAoKYGBge3J9CnBuZyhmaWxlbmFtZT0iUmVzdWx0cy9GaWd1cmVzL2VsYXN0aWNOZXRfc2luZ2xlVGlzc3Vlcy9PdXRjb21lX2FkZC9zZXhfc3BsaXQvYm9vdHN0cmFwTW9kZWxzX1BsYWNlbnRhX2ZlbWFsZS5wbmciLCB3aWR0aD0yNDAwLCBoZWlnaHQ9MTgwMCwgcmVzPTMwMCkKZ3JpZEV4dHJhOjpncmlkLmFycmFuZ2UoZzFfUGxhY2VudGFfZmVtYWxlX0lUVV9uLCBnMl9QbGFjZW50YV9mZW1hbGVfSVRVX24sIG5jb2wgPSAxKQpkZXYub2ZmKCkKYGBgCmBgYHtyfQplbGJvd19maW5kZXIoY3N1bW1hcnlfUGxhY2VudGFfZmVtYWxlX0lUVV9uJG56ZXJvLCBjc3VtbWFyeV9QbGFjZW50YV9mZW1hbGVfSVRVX24kbWVkaWFuX2N2bSkKCm56ZXJvX2luZGljZXNfQ29yZCA8LSBkYXRhLmZyYW1lKHQoZWxib3dfZmluZGVyKGNzdW1tYXJ5X1BsYWNlbnRhX2ZlbWFsZV9JVFVfbiRuemVybywgY3N1bW1hcnlfUGxhY2VudGFfZmVtYWxlX0lUVV9uJG1lZGlhbl9jdm0pKSkKY29sbmFtZXMobnplcm9faW5kaWNlc19Db3JkKSA8LSBjKCJ4IiwgInkiKQpyb3duYW1lcyhuemVyb19pbmRpY2VzX0NvcmQpIDwtIE5VTEwKYGBgCgpgYGB7cn0Kbnplcm9fZmluYWxfcGxhY2VudGFfZmVtYWxlIDwtIDcKYGBgCgoKYGBge3J9CmNzdW1tYXJ5X1BsYWNlbnRhX2ZlbWFsZV9JVFVfbltuemVybyAlaW4lIG56ZXJvX2ZpbmFsX3BsYWNlbnRhX2ZlbWFsZV0KYGBgCgoKYGBge3J9Cm5vbnplcm9fY2hvb3NlX1BsYWNlbnRhX2ZlbWFsZSA8LSBnZ3Bsb3QyOjpnZ3Bsb3QoY3N1bW1hcnlfUGxhY2VudGFfZmVtYWxlX0lUVV9uKSArCiAgZ2dwbG90Mjo6dGhlbWVfYncoKSsKICBnZ3Bsb3QyOjphZXMoeCA9IG56ZXJvLCB5ID0gbWVkaWFuX2N2bSkgKwogIGdncGxvdDI6OnNjYWxlX3hfY29udGludW91cyhicmVha3M9YygwOjE3KSkrCiAgZ2dwbG90Mjo6Z2VvbV9wb2ludCgpICsgZ2dwbG90Mjo6Z2VvbV9saW5lKCkrCiAgZ2dwbG90Mjo6Z2VvbV9wb2ludChkYXRhPW56ZXJvX2luZGljZXNfQ29yZCwgYWVzKHg9eCwgeT15KSwgY29sb3VyPSJyZWQiLCBzaXplPTIpKwogIGdncGxvdDI6OnlsYWIoIm1lZGlhbiBvZiBtaW5pbXVtIGNyb3NzLXZhbGlkYXRpb24gZXJyb3JzIG92ZXIgYm9vdHN0cmFwcyIpKwogIGdncGxvdDI6OnhsYWIoIm51bWJlciBvZiBub24temVybyBjb2VmZmljaWVudHMiKSsKICBnZ3Bsb3QyOjpnZW9tX3NlZ21lbnQoYWVzKHggPSBuemVyb1sxXSwgeSA9IG1lZGlhbl9jdm1bMV0sIHhlbmQgPSBuemVyb1sxM10sIHllbmQgPSBtZWRpYW5fY3ZtWzEzXSwgY29sb3VyID0gInNlZ21lbnQiKSwgZGF0YSA9IGNzdW1tYXJ5X1BsYWNlbnRhX2ZlbWFsZV9JVFVfbiwgc2hvdy5sZWdlbmQgPSBGKQoKbm9uemVyb19jaG9vc2VfUGxhY2VudGFfZmVtYWxlCmBgYAoKYGBge3J9CnBuZyhmaWxlbmFtZT0iUmVzdWx0cy9GaWd1cmVzL2VsYXN0aWNOZXRfc2luZ2xlVGlzc3Vlcy9PdXRjb21lX2FkZC9zZXhfc3BsaXQvbnplcm9fY2hvb3NlX1BsYWNlbnRhX2ZlbWFsZS5wbmciLCB3aWR0aD0xNjAwLCBoZWlnaHQ9MTQwMCwgcmVzPTMwMCkKbm9uemVyb19jaG9vc2VfUGxhY2VudGFfZmVtYWxlCmRldi5vZmYoKQpgYGAKCgpgYGB7cn0Kc3VtbWFyeV9QbGFjZW50YV9mZW1hbGVfSVRVX25fZmluYWxuemVybyA8LSBjc3VtbWFyeV9QbGFjZW50YV9mZW1hbGVfSVRVX25bbnplcm8gJWluJSBuemVyb19maW5hbF9wbGFjZW50YV9mZW1hbGVdCnNpZ192YXJfbmFtZXNfUGxhY2VudGFfZmVtYWxlX0lUVV9uX2ZpbmFsbnplcm8gPC0gRmlsdGVyKGZ1bmN0aW9uKHgpIGFueSh4ID4gMC43NSksIHN1bW1hcnlfUGxhY2VudGFfZmVtYWxlX0lUVV9uX2ZpbmFsbnplcm9bLCFjKCJuemVybyIsICJtZWFuX2N2bSIsICJtZWRpYW5fY3ZtIildKSAlPiUgY29sbmFtZXMoKQpjb2xuYW1lcyhzdW1tYXJ5X1BsYWNlbnRhX2ZlbWFsZV9JVFVfbl9maW5hbG56ZXJvKSA8LSBjKCJub24temVybyIsICJiaXJ0aCB3ZWlnaHQiLCAiYmlydGggbGVuZ3RoIiwgImhlYWQgY2lyY3VtZmVyZW5jZSIsICJkZWxpdmVyeSBtb2RlIChhaWRlZCkiLCAiaW5kdWNlZCBsYWJvciAoeWVzKSIsICJwYXJpdHkgKGJpcnRoIGJlZm9yZSkiLCAibWF0ZXJuYWwgYWdlIiwgIm1hdGVybmFsIEJNSSIsICJtYXRlcm5hbCBoeXBlcnRlbnNpb24gKHllcykiLCAibWF0ZXJuYWwgZGlhYmV0ZXMgKHllcykiLCAibWF0ZXJuYWwgbWVudGFsIGRpc29yZGVycyAoeWVzKSIsICJtYXRlcm5hbCBzbW9raW5nICh5ZXMpIiwgIm1lYW4gY3ZtIiwgIm1lZGlhbiBjdm0iKQpzdW1tYXJ5X1BsYWNlbnRhX2ZlbWFsZV9JVFVfbl9maW5hbG56ZXJvVCA8LSBhcy5kYXRhLmZyYW1lKHQoc3VtbWFyeV9QbGFjZW50YV9mZW1hbGVfSVRVX25fZmluYWxuemVyb1ssLWMoIm5vbi16ZXJvIiwgIm1lZGlhbiBjdm0iLCAibWVhbiBjdm0iKV0pKQpzdW1tYXJ5X1BsYWNlbnRhX2ZlbWFsZV9JVFVfbl9maW5hbG56ZXJvVCR2YXJpYWJsZSA8LSByb3duYW1lcyhzdW1tYXJ5X1BsYWNlbnRhX2ZlbWFsZV9JVFVfbl9maW5hbG56ZXJvVCkKcm93bmFtZXMoc3VtbWFyeV9QbGFjZW50YV9mZW1hbGVfSVRVX25fZmluYWxuemVyb1QpIDwtIE5VTEwKbmFtZXMoc3VtbWFyeV9QbGFjZW50YV9mZW1hbGVfSVRVX25fZmluYWxuemVyb1QpW25hbWVzKHN1bW1hcnlfUGxhY2VudGFfZmVtYWxlX0lUVV9uX2ZpbmFsbnplcm9UKSA9PSAnVjEnXSA8LSAncGVyY2VudCcKc3VtbWFyeV9QbGFjZW50YV9mZW1hbGVfSVRVX25fZmluYWxuemVyb1QgPC0gc3VtbWFyeV9QbGFjZW50YV9mZW1hbGVfSVRVX25fZmluYWxuemVyb1Rbb3JkZXIoc3VtbWFyeV9QbGFjZW50YV9mZW1hbGVfSVRVX25fZmluYWxuemVyb1QkcGVyY2VudCksXQoKc3VtbWFyeV9QbGFjZW50YV9mZW1hbGVfSVRVX25fZmluYWxuemVyb1QkbnVtYmVyIDwtIHNlcSgxLCBsZW5ndGgoc3VtbWFyeV9QbGFjZW50YV9mZW1hbGVfSVRVX25fZmluYWxuemVyb1QkdmFyaWFibGUpKQpgYGAKCmBgYHtyLCBmaWcud2lkdGg9OH0KcGVyY192YXJzX1BsYWNlbnRhX2ZlbWFsZV9JVFVfbiA8LSAKICBnZ3Bsb3Qoc3VtbWFyeV9QbGFjZW50YV9mZW1hbGVfSVRVX25fZmluYWxuemVyb1QsIGFlcyhyZW9yZGVyKHZhcmlhYmxlLCBwZXJjZW50KSwgcGVyY2VudCwgZ3JvdXA9MSkpKwogIGdlb21fcG9pbnQoKSsgZ2VvbV9saW5lKCkrCiAgeWxhYigiJSBvY2N1cmVuY2UgaW4gbW9kZWxzIHdpdGggbnplcm8gY29lZmZpY2llbnRzID0gNyIpKwogIHNjYWxlX3lfY29udGludW91cyhicmVha3M9YygwLjEsMC4yLDAuMywwLjQsMC41LDAuNiwwLjcsMC44LDAuOSkpKwogIHhsYWIoInZhcmlhYmxlIikrCiAgY29vcmRfZmxpcCgpKwogIGdlb21faGxpbmUoeWludGVyY2VwdD0wLjc1LCBsaW5ldHlwZT0iZG90dGVkIikrCiAgdGhlbWVfYncoKQoKcGVyY192YXJzX1BsYWNlbnRhX2ZlbWFsZV9JVFVfbgoKIyBkZWNpZGUgZm9yIGN1dC1vZmYgJSAtPiBoZXJlIC43NQoKRmlsdGVyKGZ1bmN0aW9uKHgpIGFueSh4ID4gMC43NSksIHN1bW1hcnlfUGxhY2VudGFfZmVtYWxlX0lUVV9uX2ZpbmFsbnplcm9bLCFjKCJub24temVybyIsICJtZWFuIGN2bSIsICJtZWRpYW4gY3ZtIildKQoKYGBgCgoKYGBge3J9CnBuZyhmaWxlbmFtZT0iUmVzdWx0cy9GaWd1cmVzL2VsYXN0aWNOZXRfc2luZ2xlVGlzc3Vlcy9PdXRjb21lX2FkZC9zZXhfc3BsaXQvdmFyc1BlcmNlbnRfUGxhY2VudGFfZmVtYWxlLnBuZyIsIHdpZHRoPTExMDAsIGhlaWdodD0xNDAwLCByZXM9MzAwKQpwZXJjX3ZhcnNfUGxhY2VudGFfZmVtYWxlX0lUVV9uCmRldi5vZmYoKQpgYGAKCgogIApgYGB7cn0KcG0yX1BsYWNlbnRhX2ZlbWFsZV9JVFVfbl9jb2VmIDwtCiAgZGNhc3QocG0yX1BsYWNlbnRhX2ZlbWFsZV9JVFVfblssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXMubGlzdCh1bmxpc3QoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBwbHkoLlNELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uKHgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHkgPC0gdW5uYW1lKHF1YW50aWxlKHhbeCAhPSAwXSwgcHJvYnMgPSBjKDAuMDI1LCAwLjk3NSkpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdCgibm9uX3plcm8iID0gMTAwICogbWVhbih4ICE9IDApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsY2wgPSB5WzFdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1Y2wgPSB5WzJdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aCA9IGRpZmYoeSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhbiA9IG1lZGlhbih4W3ghPSAwXSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuU0Rjb2xzID0gYygiQ2hpbGRfQmlydGhfV2VpZ2h0IiwgIkNoaWxkX0JpcnRoX0xlbmd0aCIsICJDaGlsZF9IZWFkX0NpcmN1bWZlcmVuY2VfQXRfQmlydGgiLCAiRGVsaXZlcnlfbW9kZV9kaWNob3RvbWFpZGVkIiwgIkluZHVjZWRfTGFib3VyeWVzIiwgIlBhcml0eV9kaWNob3RvbWdpdmVuIGJpcnRoIGJlZm9yZSIsICJNYXRlcm5hbF9BZ2VfWWVhcnMiLCAiTWF0ZXJuYWxfQm9keV9NYXNzX0luZGV4X2luX0Vhcmx5X1ByZWduYW5jeSIsICJNYXRlcm5hbF9IeXBlcnRlbnNpb25fZGljaG90b21oeXBlcnRlbnNpb24gaW4gY3VycmVudCBwcmVnbmFuY3kiLCAiTWF0ZXJuYWxfRGlhYmV0ZXNfZGljaG90b21kaWFiZXRlcyBpbiBjdXJyZW50IHByZWduYW5jeSIsICJNYXRlcm5hbF9NZW50YWxfRGlzb3JkZXJzWWVzIiwgInNtb2tpbmdfZGljaG90b215ZXMiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieSA9IG56ZXJvXVtvcmRlcihuemVybyldICU+JQogICAgICAgICAgbWVsdChpZC52YXIgPSAibnplcm8iKSAlPiUKICAgICAgICAgIC5bLCBtZXRyaWMgOj0gc3ViKCJeLitcXC4oLispJCIsICJcXDEiLCB2YXJpYWJsZSldICU+JQogICAgICAgICAgLlssIHZhcmlhYmxlIDo9IHN1YigiXiguKylcXC4uKyQiLCAiXFwxIiwgdmFyaWFibGUpXSAlPiUKICAgICAgICAgIC5bbnplcm8gPT1uemVyb19maW5hbF9wbGFjZW50YV9mZW1hbGVdLCBuemVybysgdmFyaWFibGUgfiBtZXRyaWMsIHZhbHVlLnZhcj0idmFsdWUiKQoKIyBnZXQgZGVzaXJlZCBvcmRlciBvZiBwcmVkaWN0b3JzCnBtMl9QbGFjZW50YV9mZW1hbGVfSVRVX25fY29lZiA8LQogIHBtMl9QbGFjZW50YV9mZW1hbGVfSVRVX25fY29lZlttYXRjaChjKCJDaGlsZF9CaXJ0aF9XZWlnaHQiLCAiQ2hpbGRfQmlydGhfTGVuZ3RoIiwgIkNoaWxkX0hlYWRfQ2lyY3VtZmVyZW5jZV9BdF9CaXJ0aCIsICJEZWxpdmVyeV9tb2RlX2RpY2hvdG9tYWlkZWQiLCAiSW5kdWNlZF9MYWJvdXJ5ZXMiLCAiUGFyaXR5X2RpY2hvdG9tZ2l2ZW4gYmlydGggYmVmb3JlIiwgIk1hdGVybmFsX0FnZV9ZZWFycyIsICJNYXRlcm5hbF9Cb2R5X01hc3NfSW5kZXhfaW5fRWFybHlfUHJlZ25hbmN5IiwgIk1hdGVybmFsX0h5cGVydGVuc2lvbl9kaWNob3RvbWh5cGVydGVuc2lvbiBpbiBjdXJyZW50IHByZWduYW5jeSIsICJNYXRlcm5hbF9EaWFiZXRlc19kaWNob3RvbWRpYWJldGVzIGluIGN1cnJlbnQgcHJlZ25hbmN5IiwgIk1hdGVybmFsX01lbnRhbF9EaXNvcmRlcnNZZXMiLCAic21va2luZ19kaWNob3RvbXllcyIpLCBwbTJfUGxhY2VudGFfZmVtYWxlX0lUVV9uX2NvZWYkdmFyaWFibGUpLF0KcG0yX1BsYWNlbnRhX2ZlbWFsZV9JVFVfbl9jb2VmJHZhcmlhYmxlIDwtIGZhY3RvcihwbTJfUGxhY2VudGFfZmVtYWxlX0lUVV9uX2NvZWYkdmFyaWFibCwgbGV2ZWxzPXVuaXF1ZShwbTJfUGxhY2VudGFfZmVtYWxlX0lUVV9uX2NvZWYkdmFyaWFibGUpKQoKYGBgCgoKYGBge3J9CnNpZ192YXJzX1BsYWNlbnRhX2ZlbWFsZV9JVFVfbiA8LQogIHBtMl9QbGFjZW50YV9mZW1hbGVfSVRVX25fY29lZiAlPiUKICBnZ3Bsb3QyOjpnZ3Bsb3QoLikgKwogIGdncGxvdDI6OnRoZW1lX2J3KCkgKwogIGdncGxvdDI6OnRoZW1lKGF4aXMudGV4dC54PWVsZW1lbnRfYmxhbmsoKSkrCiAgZ2dwbG90Mjo6YWVzKHg9Im56ZXJvIikrCiAgZ2dwbG90Mjo6Z2VvbV9wb2ludChtYXBwaW5nID0gZ2dwbG90Mjo6YWVzKHkgPSB2YXJpYWJsZSwgc2l6ZSA9bm9uX3plcm8sIGFscGhhID0gbm9uX3plcm8sIGNvbG9yID0gbm9uX3plcm8pKSArCiAgZ2dwbG90Mjo6Z2VvbV90ZXh0KGFlcyh5PXZhcmlhYmxlLCBsYWJlbD1zcHJpbnRmKCIlMC4yZiIsIHJvdW5kKG1lZGlhbiwgZGlnaXRzPTIpKSwgc2l6ZT01MCksaGp1c3Q9MCwgdmp1c3Q9MC41LCBudWRnZV94ID0gMC4xKSsKICBnZ3Bsb3QyOjpzY2FsZV9jb2xvcl9ncmFkaWVudDIoaGlnaCA9ICdncmVlbicsIG1pZCA9ICJwdXJwbGUiLCBsb3cgPSAiYmxhY2siLCBtaWRwb2ludCA9NTApKwogIGdncGxvdDI6OnNjYWxlX2FscGhhKGd1aWRlID0gJ25vbmUnKSsKICBnZ3Bsb3QyOjpzY2FsZV9zaXplKGd1aWRlID0gJ25vbmUnKSsKICBnZ3Bsb3QyOjpzY2FsZV95X2Rpc2NyZXRlKGxhYmVscz0gYygiYmlydGggd2VpZ2h0IiwgImJpcnRoIGxlbmd0aCIsICJoZWFkIGNpcmN1bWZlcmVuY2UiLCAiZGVsaXZlcnkgbW9kZSAoYWlkZWQpIiwgImluZHVjZWQgbGFib3IgKHllcykiLCAicGFyaXR5IChiaXJ0aCBiZWZvcmUpIiwgIm1hdGVybmFsIGFnZSIsICJtYXRlcm5hbCBCTUkiLCAibWF0ZXJuYWwgaHlwZXJ0ZW5zaW9uICh5ZXMpIiwgIm1hdGVybmFsIGRpYWJldGVzICh5ZXMpIiwgIm1hdGVybmFsIG1lbnRhbCBkaXNvcmRlcnMgKHllcykiLCAibWF0ZXJuYWwgc21va2luZyAoeWVzKSIpKSsKICBnZ3Bsb3QyOjpsYWJzKHk9InByZWRpY3RvciIsIHggPSAibnVtYmVyIG9mIG5vbi16ZXJvIGNvZWZmaWNpZW50cyA9IDQiLCBjb2xvcj0iJSIpCgpgYGAKCmBgYHtyfQpjb2VmX1BsYWNlbnRhX2ZlbWFsZV9JVFVfbiA8LSAKICBnZ3Bsb3QocG0yX1BsYWNlbnRhX2ZlbWFsZV9JVFVfbl9jb2VmLCBhZXMoeSA9IHZhcmlhYmxlLCB4PW1lZGlhbikpKwogIGdlb21fcG9pbnQobWFwcGluZyA9IGdncGxvdDI6OmFlcyh5ID0gdmFyaWFibGUsIHNpemUgPW5vbl96ZXJvLCBhbHBoYSA9IG5vbl96ZXJvLCBjb2xvciA9IG5vbl96ZXJvKSkrCiAgc2NhbGVfY29sb3JfZ3JhZGllbnQyKGhpZ2ggPSAnZ3JlZW4nLCBtaWQgPSAicHVycGxlIiwgbG93ID0gImJsYWNrIiwgbWlkcG9pbnQgPTUwLCBsaW1pdHM9YygwLDEwMCkpKwogIHNjYWxlX2FscGhhKGd1aWRlID0gJ25vbmUnKSsKICBzY2FsZV9zaXplKGd1aWRlID0gJ25vbmUnKSsKICBnZW9tX3BvaW50KCkrCiAgZ2VvbV9lcnJvcmJhcihhZXMoeSA9IHZhcmlhYmxlLCB4bWluID0gbGNsLCB4bWF4ID0gdWNsKSwgd2lkdGggPSAwLjIpKwogIGxhYnMoeT0icHJlZGljdG9yIiwgeCA9ICJcbm1lZGlhbiAmIDk1JSBDSSBvZiBjb2VmZmljaWVudCAob3ZlciBib290c3RyYXBzKSIsIGNvbG9yPSIlIikrCiAgc2NhbGVfeF9jb250aW51b3VzKGxpbWl0cz1jKC0wLjQsMC40KSwgYnJlYWtzPWMoLS40LC0uMywtLjIsIC0uMSwgMCwgLjEsIC4yLCAuMywgLjQpKSsKICBzY2FsZV95X2Rpc2NyZXRlKGxhYmVscz0gYygiYmlydGggd2VpZ2h0IiwgImJpcnRoIGxlbmd0aCIsICJoZWFkIGNpcmN1bWZlcmVuY2UiLCAiZGVsaXZlcnkgbW9kZSAoYWlkZWQpIiwgImluZHVjZWQgbGFib3IgKHllcykiLCAicGFyaXR5IChiaXJ0aCBiZWZvcmUpIiwgIm1hdGVybmFsIGFnZSIsICJtYXRlcm5hbCBCTUkiLCAibWF0ZXJuYWwgaHlwZXJ0ZW5zaW9uICh5ZXMpIiwgIm1hdGVybmFsIGRpYWJldGVzICh5ZXMpIiwgIm1hdGVybmFsIG1lbnRhbCBkaXNvcmRlcnMgKHllcykiLCAibWF0ZXJuYWwgc21va2luZyAoeWVzKSIpKSsKICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQ9MCwgbGluZXR5cGU9ImRhc2hlZCIpKwogIHRoZW1lX2J3KCkrCiAgdGhlbWUodGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTUpLCBheGlzLnRpdGxlLng9IGVsZW1lbnRfdGV4dChzaXplPTE1KSwgYXhpcy50aXRsZS55PSBlbGVtZW50X3RleHQoc2l6ZT0xNSkpCgoKY29lZl9QbGFjZW50YV9mZW1hbGVfSVRVX24KYGBgCgpgYGB7cn0KcG5nKGZpbGVuYW1lPSJSZXN1bHRzL0ZpZ3VyZXMvZWxhc3RpY05ldF9zaW5nbGVUaXNzdWVzL091dGNvbWVfYWRkL3NleF9zcGxpdC9jb2VmX1BsYWNlbnRhX2ZlbWFsZS5wbmciLCAgd2lkdGg9MjgwMCwgaGVpZ2h0PTE0MDAsIHJlcz00MDApCmNvZWZfUGxhY2VudGFfZmVtYWxlX0lUVV9uCmRldi5vZmYoKQpgYGAKCmBgYHtyfQpwMSA8LQogIGNzdW1tYXJ5X1BsYWNlbnRhX2ZlbWFsZV9JVFVfbiAlPiUKICBtZWx0KGlkLnZhcnMgPSBjKCJuemVybyIsICJtZWFuX2N2bSIsICJtZWRpYW5fY3ZtIikpICU+JQogIGdncGxvdDI6OmdncGxvdCguKSArCiAgZ2dwbG90Mjo6dGhlbWVfYncoKSArCiAgZ2dwbG90Mjo6YWVzKHggPSBuemVybykgKwogIGdncGxvdDI6Omdlb21fcG9pbnQobWFwcGluZyA9IGdncGxvdDI6OmFlcyh5ID0gdmFyaWFibGUsIHNpemUgPSB2YWx1ZSwgYWxwaGEgPSB2YWx1ZSwgY29sb3IgPSB2YWx1ZSoxMDApKSArCiAgZ2dwbG90Mjo6c2NhbGVfY29sb3JfZ3JhZGllbnQyKGhpZ2ggPSAnZ3JlZW4nLCBtaWQgPSAicHVycGxlIiwgbG93ID0gImJsYWNrIiwgbWlkcG9pbnQgPTUwKSsKICBnZ3Bsb3QyOjpzY2FsZV9hbHBoYShndWlkZSA9ICdub25lJykrCiAgZ2dwbG90Mjo6c2NhbGVfc2l6ZShndWlkZSA9ICdub25lJykrCiAgZ2dwbG90Mjo6c2NhbGVfeV9kaXNjcmV0ZShsYWJlbHM9IGMoImJpcnRoIHdlaWdodCIsICJiaXJ0aCBsZW5ndGgiLCAiaGVhZCBjaXJjdW1mZXJlbmNlIiwgImRlbGl2ZXJ5IG1vZGUgKGFpZGVkKSIsICJpbmR1Y2VkIGxhYm9yICh5ZXMpIiwgInBhcml0eSAoYmlydGggYmVmb3JlKSIsICJtYXRlcm5hbCBhZ2UiLCAibWF0ZXJuYWwgQk1JIiwgIm1hdGVybmFsIGh5cGVydGVuc2lvbiAoeWVzKSIsICJtYXRlcm5hbCBkaWFiZXRlcyAoeWVzKSIsICJtYXRlcm5hbCBtZW50YWwgZGlzb3JkZXJzICh5ZXMpIiwgIm1hdGVybmFsIHNtb2tpbmcgKHllcykiKSkrCiAgZ2dwbG90Mjo6c2NhbGVfeF9jb250aW51b3VzKGJyZWFrcz0wOjE0LCBsYWJlbHM9KSsKICBnZ3Bsb3QyOjpsYWJzKHk9InByZWRpY3RvciIsIHggPSAiXG5udW1iZXIgb2Ygbm9uLXplcm8gY29lZmZpY2llbnRzIiwgY29sb3I9IiUiKSsKICBnZ3Bsb3QyOjp0aGVtZSh0ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNyksIGF4aXMudGl0bGUueD0gZWxlbWVudF90ZXh0KHNpemU9MTUpLCBheGlzLnRpdGxlLnk9IGVsZW1lbnRfdGV4dChzaXplPTE1KSwgbGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKQogIApwMiA8LSAKY29lZl9QbGFjZW50YV9mZW1hbGVfSVRVX24gPC0gCiAgZ2dwbG90KHBtMl9QbGFjZW50YV9mZW1hbGVfSVRVX25fY29lZiwgYWVzKHkgPSB2YXJpYWJsZSwgeD1tZWRpYW4pKSsKICBnZW9tX3BvaW50KG1hcHBpbmcgPSBnZ3Bsb3QyOjphZXMoeSA9IHZhcmlhYmxlLCBzaXplID1ub25femVybywgYWxwaGEgPSBub25femVybywgY29sb3IgPSBub25femVybykpKwogIHNjYWxlX2NvbG9yX2dyYWRpZW50MihoaWdoID0gJ2dyZWVuJywgbWlkID0gInB1cnBsZSIsIGxvdyA9ICJibGFjayIsIG1pZHBvaW50ID01MCwgbGltaXRzPWMoMCwxMDApKSsKICBzY2FsZV9hbHBoYShndWlkZSA9ICdub25lJykrCiAgc2NhbGVfc2l6ZShndWlkZSA9ICdub25lJykrCiAgZ2VvbV9wb2ludCgpKwogIGdlb21fZXJyb3JiYXIoYWVzKHkgPSB2YXJpYWJsZSwgeG1pbiA9IGxjbCwgeG1heCA9IHVjbCksIHdpZHRoID0gMC4yKSsKICBsYWJzKHk9IiIsIHggPSAiXG5tZWRpYW4gJiA5NSUgQ0kgb2YgY29lZmZpY2llbnQgKG92ZXIgYm9vdHN0cmFwcykiLCBjb2xvcj0iJSIpKwogIHNjYWxlX3hfY29udGludW91cyhsaW1pdHM9YygtMC40LDAuNCksIGJyZWFrcz1jKC0uNCwtLjMsLS4yLCAtLjEsIDAsIC4xLCAuMiwgLjMsIC40KSkrCiAgc2NhbGVfeV9kaXNjcmV0ZShsYWJlbHM9IGMoImJpcnRoIHdlaWdodCIsICJiaXJ0aCBsZW5ndGgiLCAiaGVhZCBjaXJjdW1mZXJlbmNlIiwgImRlbGl2ZXJ5IG1vZGUgKGFpZGVkKSIsICJpbmR1Y2VkIGxhYm9yICh5ZXMpIiwgInBhcml0eSAoYmlydGggYmVmb3JlKSIsICJtYXRlcm5hbCBhZ2UiLCAibWF0ZXJuYWwgQk1JIiwgIm1hdGVybmFsIGh5cGVydGVuc2lvbiAoeWVzKSIsICJtYXRlcm5hbCBkaWFiZXRlcyAoeWVzKSIsICJtYXRlcm5hbCBtZW50YWwgZGlzb3JkZXJzICh5ZXMpIiwgIm1hdGVybmFsIHNtb2tpbmcgKHllcykiKSkrCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0PTAsIGxpbmV0eXBlPSJkYXNoZWQiKSsKICB0aGVtZV9idygpKwogIGdndGl0bGUoIm56ZXJvID0gNyIpKwogIHRoZW1lKHRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE3KSwgYXhpcy50aXRsZS54PSBlbGVtZW50X3RleHQoc2l6ZT0xNSksIGF4aXMudGl0bGUueT0gZWxlbWVudF90ZXh0KHNpemU9MTUpLCBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MTUpLCBheGlzLnRleHQueT1lbGVtZW50X2JsYW5rKCkpCgpnMSA8LSBnZ3Bsb3RHcm9iKHAxKQpnMiA8LSBnZ3Bsb3RHcm9iKHAyKQpnIDwtIGNiaW5kKGcxLCBnMiwgc2l6ZSA9ICJsYXN0IikKZyRoZWlnaHRzIDwtIHVuaXQucG1heChnMSRoZWlnaHRzLCBnMiRoZWlnaHRzKQoKcG5nKGZpbGVuYW1lPSJSZXN1bHRzL0ZpZ3VyZXMvZWxhc3RpY05ldF9zaW5nbGVUaXNzdWVzL091dGNvbWVfYWRkL3NleF9zcGxpdC9Nb2RlbF9jb2VmX1BsYWNlbnRhX2ZlbWFsZS5wbmciLCB3aWR0aD01ODAwLCBoZWlnaHQ9MTYwMCwgcmVzPTQwMCkKZ3JpZC5kcmF3KGcpCmRldi5vZmYoKQpgYGAKClt0byB0aGUgdG9wXSgjdG9wKQoKKipQUkVETyoqCgojIyBQbGFjZW50YSBlbGFzdGljIG5ldCB7I2VsYXN0aWNuZXRQbGFjZW50YVBSRURPfSAgCgoKYGBge3J9CiMgaW4gY2FzZSB5b3Ugd2FudCB0byBzdGFydCBmcm9tIGhlcmUKbG9hZCgiSW5wdXREYXRhL0Nsb2NrQ2FsY3VsYXRpb25zSW5wdXQvUmVnX0lucHV0X0RhdGFfUGxhY2VudGFfUFJFRE9fRUFBUl9ub05hX24uUmRhdGEiKQpgYGAKCgpgYGB7cn0KeXJjX21hdF9QUkVET19QbGFjZW50YV9uIDwtIG1hdHJpeChSZWdfSW5wdXRfRGF0YV9QbGFjZW50YV9QUkVET19FQUFSX25vTmFfbiRFQUFSX0xlZSkKeHJjX21hdF9QUkVET19QbGFjZW50YV9uIDwtIG1vZGVsLm1hdHJpeCggfiAuIC0gRUFBUl9MZWUsIGRhdGEgPSBSZWdfSW5wdXRfRGF0YV9QbGFjZW50YV9QUkVET19FQUFSX25vTmFfbilbLCAtMV0KeXJjX21hdF9QUkVET19zY2FsZWRfUGxhY2VudGFfbiA8LSBzY2FsZSh5cmNfbWF0X1BSRURPX1BsYWNlbnRhX24pCnhyY19tYXRfUFJFRE9fc2NhbGVkX1BsYWNlbnRhX24gPC0gc2NhbGUoeHJjX21hdF9QUkVET19QbGFjZW50YV9uKQpgYGAKCjwhLS0gc2V0IHNlZWQgLS0+CjwhLS0gYGBge3J9IC0tPgo8IS0tIHNldC5zZWVkKDIwMjApIC0tPgo8IS0tIGBgYCAtLT4KCgo8IS0tIGBgYHtyLCB3YXJuaW5nPUZ9IC0tPgo8IS0tICAgbmJvb3QgPSAxMDAwIC0tPgoKPCEtLSAgIHN0YXJ0X3RpbWUgPC0gU3lzLnRpbWUoKSAtLT4KPCEtLSAgIGJvb3RzdHJhcHNfUGxhY2VudGFfUFJFRE9fbiA8LSByZXBsaWNhdGUobmJvb3QsIHsgLS0+CjwhLS0gICAgIHJ3cyA8LSBzYW1wbGUoMTpucm93KHhyY19tYXRfUFJFRE9fc2NhbGVkX1BsYWNlbnRhX24pLCByZXBsYWNlID0gVFJVRSkgLS0+CjwhLS0gICAgIGVuc3IoeHJjX21hdF9QUkVET19zY2FsZWRfUGxhY2VudGFfbltyd3MsIF0sIHlyY19tYXRfUFJFRE9fc2NhbGVkX1BsYWNlbnRhX25bcndzLCBdLCBzdGFuZGFyZGl6ZWQgPSBGQUxTRSwgZmFtaWx5PSJnYXVzc2lhbiIsIG5sYW1iZGE9MTAwLCBuZm9sZHM9MTAsIGFscGhhPWMoMC4wLDAuMSwwLjIsMC4zLDAuNCwwLjUsMC42LDAuNywwLjgsMC45LDEuMCkpIC0tPgo8IS0tICAgfSwgLS0+CjwhLS0gICBzaW1wbGlmeSA9IEZBTFNFKSAtLT4KCjwhLS0gICBlbmRfdGltZSA8LSBTeXMudGltZSgpIC0tPgo8IS0tICAgZW5kX3RpbWUgLSBzdGFydF90aW1lIC0tPgoKPCEtLSAgICNUaW1lIGRpZmZlcmVuY2Ugb2YgMy4xNTkzMTkgaG91cnMgLS0+Cgo8IS0tIGBgYCAtLT4KCjwhLS0gYGBge3J9IC0tPgo8IS0tIHNhdmUoYm9vdHN0cmFwc19QbGFjZW50YV9QUkVET19uLCBmaWxlPSJJbnB1dERhdGEvRGF0YV9FbGFzdGljTmV0cy9ib290c3RyYXBzX1BsYWNlbnRhX1BSRURPX25fMTAwMC5SZGF0YSIpIC0tPgo8IS0tIGBgYCAtLT4KCgpgYGB7cn0KbG9hZCgiSW5wdXREYXRhL0RhdGFfRWxhc3RpY05ldHMvYm9vdHN0cmFwc19QbGFjZW50YV9QUkVET19uXzEwMDAuUmRhdGEiKQpgYGAKCgpgYGB7cn0Kc3VtbWFyaWVzX1BsYWNlbnRhX1BSRURPX24gPC0KICBib290c3RyYXBzX1BsYWNlbnRhX1BSRURPX24gJT4lCiAgbGFwcGx5KHN1bW1hcnkpICU+JQogIHJiaW5kbGlzdChpZGNvbCA9ICJib290c3RyYXAiKQoKc3VtbWFyaWVzX1BsYWNlbnRhX1BSRURPX24KYGBgCgpgYGB7cn0Kc3VtbWFyaWVzX1BsYWNlbnRhX1BSRURPX25bLCAuU0RbY3ZtID09IG1pbihjdm0pXSwgYnkgPSBjKCJib290c3RyYXAiLCAibnplcm8iKV0gJT4lCiAgZ2dwbG90Mjo6Z2dwbG90KGRhdGEgPSAuKSArCiAgZ2dwbG90Mjo6YWVzKHggPSBuemVybywgeSA9IGN2bSwgZ3JvdXAgPSBib290c3RyYXApICsKICBnZ3Bsb3QyOjpnZW9tX3BvaW50KCkgKwogIGdncGxvdDI6Omdlb21fbGluZSgpCmBgYAoKCmBgYHtyfQpwbmcoZmlsZW5hbWU9IlJlc3VsdHMvRmlndXJlcy9lbGFzdGljTmV0X3NpbmdsZVRpc3N1ZXMvT3V0Y29tZV9tYWluL2Jvb3RzdHJhcHNfUGxhY2VudGFfUFJFRE8ucG5nIiwgd2lkdGg9ODAwLCBoZWlnaHQ9NjAwKQpzdW1tYXJpZXNfUGxhY2VudGFfUFJFRE9fblssIC5TRFtjdm0gPT0gbWluKGN2bSldLCBieSA9IGMoImJvb3RzdHJhcCIsICJuemVybyIpXSAlPiUKICBnZ3Bsb3QyOjpnZ3Bsb3QoZGF0YSA9IC4pICsKICBnZ3Bsb3QyOjphZXMoeCA9IG56ZXJvLCB5ID0gY3ZtLCBncm91cCA9IGJvb3RzdHJhcCkgKwogIGdncGxvdDI6Omdlb21fcG9pbnQoKSArCiAgZ2dwbG90Mjo6Z2VvbV9saW5lKCkKZGV2Lm9mZigpCmBgYAoKCgo8IS0tIGBgYHtyLCB3YXJuaW5nPUZBTFNFfSAtLT4KPCEtLSAjIGxvd2VzdCBjdm0gYnkgYm9vdHN0cmFwIGFuZCBuemVybyAtLT4KPCEtLSBwbV9QbGFjZW50YV9QUkVET19uIDwtIHN1bW1hcmllc19QbGFjZW50YV9QUkVET19uWywgLlNEW2N2bSA9PSBtaW4oY3ZtKV0sIGJ5ID0gYygiYm9vdHN0cmFwIiwgIm56ZXJvIildIC0tPgo8IS0tIHBtMl9QbGFjZW50YV9QUkVET19uIDwtIE5VTEwgLS0+Cgo8IS0tIGZvcihpIGluIGFzLmludGVnZXIoc2VxKDEsIG5yb3cocG1fUGxhY2VudGFfUFJFRE9fbiksIGJ5ID0gMSkpKSB7IC0tPgo8IS0tICAgcG0yX1BsYWNlbnRhX1BSRURPX24gPC0gcmJpbmQocG0yX1BsYWNlbnRhX1BSRURPX24sIC0tPgo8IS0tICAgICAgICAgICAgICAgIGNiaW5kKHBtX1BsYWNlbnRhX1BSRURPX25baSwgXSwgLS0+CjwhLS0gICAgICAgICAgICAgICAgdChhcy5tYXRyaXgoY29lZihib290c3RyYXBzX1BsYWNlbnRhX1BSRURPX25bW3BtX1BsYWNlbnRhX1BSRURPX25baSwgYm9vdHN0cmFwXV1dW1twbV9QbGFjZW50YV9QUkVET19uW2ksIGxfaW5kZXhdXV0sIHMgPSBwbV9QbGFjZW50YV9QUkVET19uW2ksIGxhbWJkYV0pKSkgLS0+CjwhLS0gICAgICAgICAgICAgICAgKSAtLT4KPCEtLSAgICkgLS0+CjwhLS0gfSAtLT4KCjwhLS0gcG0yX1BsYWNlbnRhX1BSRURPX24gLS0+CjwhLS0gYGBgIC0tPgoKCjwhLS0gYGBge3J9IC0tPgo8IS0tICMgc2F2ZSAicHJlZmVyYWJsZSBtb2RlbHMiIC0tPgo8IS0tIHNhdmUocG0yX1BsYWNlbnRhX1BSRURPX24sIGZpbGU9IklucHV0RGF0YS9EYXRhX0VsYXN0aWNOZXRzL3BtMl9QbGFjZW50YV9QUkVET19uLlJkYXRhIikgLS0+CjwhLS0gYGBgIC0tPgoKCmBgYHtyfQpsb2FkKCJJbnB1dERhdGEvRGF0YV9FbGFzdGljTmV0cy9wbTJfUGxhY2VudGFfUFJFRE9fbi5SZGF0YSIpCiMgY29lZmZpY2llbnQgdmFsdWVzIGZvciB0aGUgbW9kZWxzIHdpdGggc21hbGxlc3QgY3ZtIGJ5IG51bWJlciBvZiBub24tZXJ6byBjb2VmZmljaWVudHMgYW5kIGJvb3RzdHJhcApgYGAKCgpgYGB7cn0KY3N1bW1hcnlfUGxhY2VudGFfUFJFRE9fbiA8LSBSZWR1Y2UoZnVuY3Rpb24oeCx5KSBtZXJnZSh4ID0geCwgeSA9IHksIGJ5ID0gIm56ZXJvIiksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdChwbTJfUGxhY2VudGFfUFJFRE9fblssIGxhcHBseSguU0QsIGZ1bmN0aW9uKHgpIHttZWFuKHggIT0gMCl9KSwgLlNEY29scyA9IGMoIkNoaWxkX1NleGZlbWFsZSIsICJCaXJ0aF9XZWlnaHQiLCAiQmlydGhfTGVuZ3RoIiwgIkhlYWRfQ2lyY3VtZmVyZW5jZV9hdF9CaXJ0aCIsICJEZWxpdmVyeV9Nb2RlX2RpY2hvdG9tYWlkZWQiLCAiaW5kdWNlZGxhYm91clllcyIsICJQYXJpdHlfZGljaG90b21naXZlbiBiaXJ0aCBiZWZvcmUiLCAiTWF0ZXJuYWxfQWdlXzE4UG9wUmVnYW5kQlIiLCAiTWF0ZXJuYWxfUHJlcHJlZ25hbmN5Qk1JMThvY3QyOG5ldyIsICJtYXRlcm5hbF9oeXBlcnRlbnNpb25fZGljaG90b21oeXBlcnRlbnNpb24gaW4gY3VycmVudCBwcmVnbmFuY3kiLCJtYXRlcm5hbF9kaWFiZXRlc19kaWNob3RvbWRpYWJldGVzIGluIGN1cnJlbnQgcHJlZ25hbmN5IiwiTWF0ZXJuYWxfTWVudGFsX0Rpc29yZGVyc19CeV9DaGlsZGJpcnRoWWVzIiwic21va2luZ19kaWNob3RvbXllcyIpLCBieSA9IG56ZXJvXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBtMl9QbGFjZW50YV9QUkVET19uWywgLihtZWFuX2N2bSA9IG1lYW4oY3ZtKSksIGJ5ID0gbnplcm9dLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbTJfUGxhY2VudGFfUFJFRE9fblssIC4obWVkaWFuX2N2bSA9IG1lZGlhbihjdm0pKSwgYnkgPSBuemVyb10KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkpW29yZGVyKG56ZXJvKV0KCmNzdW1tYXJ5X1BsYWNlbnRhX1BSRURPX24KYGBgCgoKYGBge3J9CmcxX1BsYWNlbnRhX1BSRURPX24gPC0KICBjc3VtbWFyeV9QbGFjZW50YV9QUkVET19uICU+JQogIG1lbHQoaWQudmFycyA9IGMoIm56ZXJvIiwgIm1lYW5fY3ZtIiwgIm1lZGlhbl9jdm0iKSkgJT4lCiAgZ2dwbG90Mjo6Z2dwbG90KC4pICsKICBnZ3Bsb3QyOjp0aGVtZV9idygpICsKICBnZ3Bsb3QyOjphZXMoeCA9IG56ZXJvKSArCiAgZ2dwbG90Mjo6Z2VvbV9wb2ludChtYXBwaW5nID0gZ2dwbG90Mjo6YWVzKHkgPSB2YXJpYWJsZSwgc2l6ZSA9IHZhbHVlLCBhbHBoYSA9IHZhbHVlLCBjb2xvciA9IHZhbHVlKjEwMCkpICsKICBnZ3Bsb3QyOjpzY2FsZV9jb2xvcl9ncmFkaWVudDIoaGlnaCA9ICdncmVlbicsIG1pZCA9ICJwdXJwbGUiLCBsb3cgPSAiYmxhY2siLCBtaWRwb2ludCA9NTApKwogIGdncGxvdDI6OnNjYWxlX2FscGhhKGd1aWRlID0gJ25vbmUnKSsKICBnZ3Bsb3QyOjpzY2FsZV9zaXplKGd1aWRlID0gJ25vbmUnKSsKICBnZ3Bsb3QyOjpzY2FsZV95X2Rpc2NyZXRlKGxhYmVscz0gYygiY2hpbGQgc2V4IiwgImJpcnRoIHdlaWdodCIsICJiaXJ0aCBsZW5ndGgiLCAiaGVhZCBjaXJjdW1mZXJlbmNlIiwgImRlbGl2ZXJ5IG1vZGUiLCAiaW5kdWNlZCBsYWJvciIsICJwYXJpdHkiLCAibWF0ZXJuYWwgYWdlIiwgIm1hdGVybmFsIEJNSSIsICJtYXRlcm5hbCBoeXBlcnRlbnNpb24iLCAibWF0ZXJuYWwgZGlhYmV0ZXMiLCAibWF0ZXJuYWwgbWVudGFsIGRpc29yZGVycyIsICJtYXRlcm5hbCBzbW9raW5nIikpKwogIGdncGxvdDI6OnNjYWxlX3hfY29udGludW91cyhicmVha3M9MDoxNCwgbGFiZWxzPSkrCiAgZ2dwbG90Mjo6bGFicyh5PSJwcmVkaWN0b3IiLCB4ID0gIm51bWJlciBvZiBub24temVybyBjb2VmZmljaWVudHMiLCBjb2xvcj0iJSIpKwogIGdncGxvdDI6OnRoZW1lKHRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE1KSwgYXhpcy50aXRsZS54PSBlbGVtZW50X3RleHQoc2l6ZT0xNSksIGF4aXMudGl0bGUueT0gZWxlbWVudF90ZXh0KHNpemU9MTUpKQoKZzJfUGxhY2VudGFfUFJFRE9fbiA8LQogIGNzdW1tYXJ5X1BsYWNlbnRhX1BSRURPX24gJT4lCiAgZ2dwbG90Mjo6Z2dwbG90KC4pICsKICBnZ3Bsb3QyOjp0aGVtZV9idygpICsKICBnZ3Bsb3QyOjphZXMoeCA9IG56ZXJvLCB5ID0gbWVkaWFuX2N2bSkgKwogIGdncGxvdDI6Omdlb21fcG9pbnQoKSArIGdncGxvdDI6Omdlb21fbGluZSgpKwogIGdncGxvdDI6OmxhYnMoeT0ibWVkaWFuIGN2bSIsIHggPSAibnVtYmVyIG9mIG5vbi16ZXJvIGNvZWZmaWNpZW50cyIpKwogIGdncGxvdDI6OnNjYWxlX3hfY29udGludW91cyhicmVha3M9MDoxNCwgbGFiZWxzPSkrCiAgZ2dwbG90Mjo6dGhlbWUoYXhpcy50ZXh0PWVsZW1lbnRfdGV4dChzaXplPTE1KSxheGlzLnRpdGxlPWVsZW1lbnRfdGV4dChzaXplPTE4KSkKCmdyaWRFeHRyYTo6Z3JpZC5hcnJhbmdlKGcxX1BsYWNlbnRhX1BSRURPX24sIGcyX1BsYWNlbnRhX1BSRURPX24sIG5jb2wgPSAxKQoKYGBgCgoKYGBge3J9CnBuZyhmaWxlbmFtZT0iUmVzdWx0cy9GaWd1cmVzL2VsYXN0aWNOZXRfc2luZ2xlVGlzc3Vlcy9PdXRjb21lX21haW4vYm9vdHN0cmFwTW9kZWxzX1BsYWNlbnRhX1BSRURPLnBuZyIsIHdpZHRoPTI0MDAsIGhlaWdodD0xODAwLCByZXM9MzAwKQpncmlkRXh0cmE6OmdyaWQuYXJyYW5nZShnMV9QbGFjZW50YV9QUkVET19uLCBnMl9QbGFjZW50YV9QUkVET19uLCBuY29sID0gMSkKZGV2Lm9mZigpCmBgYAoKYGBge3J9CnBuZyhmaWxlbmFtZT0iUmVzdWx0cy9GaWd1cmVzL2VsYXN0aWNOZXRfc2luZ2xlVGlzc3Vlcy9PdXRjb21lX21haW4vTW9kZWxfUGxhY2VudGFfUFJFRE8ucG5nIiwgd2lkdGg9MjgwMCwgaGVpZ2h0PTE0MDAsIHJlcz00MDApCmcxX1BsYWNlbnRhX1BSRURPX24KZGV2Lm9mZigpCmBgYAoKYGBge3J9CmVsYm93X2ZpbmRlcihjc3VtbWFyeV9QbGFjZW50YV9QUkVET19uJG56ZXJvLCBjc3VtbWFyeV9QbGFjZW50YV9QUkVET19uJG1lZGlhbl9jdm0pCgpuemVyb19pbmRpY2VzX1BsYWNlbnRhX1BSRURPIDwtIGRhdGEuZnJhbWUodChlbGJvd19maW5kZXIoY3N1bW1hcnlfUGxhY2VudGFfUFJFRE9fbiRuemVybywgY3N1bW1hcnlfUGxhY2VudGFfUFJFRE9fbiRtZWRpYW5fY3ZtKSkpCmNvbG5hbWVzKG56ZXJvX2luZGljZXNfUGxhY2VudGFfUFJFRE8pIDwtIGMoIngiLCAieSIpCnJvd25hbWVzKG56ZXJvX2luZGljZXNfUGxhY2VudGFfUFJFRE8pIDwtIE5VTEwKYGBgCmBgYHtyfQpuemVyb19maW5hbF9wbGFjZW50YV9wcmVkbyA8LSA2CmBgYAoKCmBgYHtyfQpjc3VtbWFyeV9QbGFjZW50YV9QUkVET19uW256ZXJvICVpbiUgbnplcm9fZmluYWxfcGxhY2VudGFfcHJlZG9dCmBgYAoKYGBge3J9Cm5vbnplcm9fY2hvb3NlX1BsYWNlbnRhX1BSRURPIDwtIGdncGxvdDI6OmdncGxvdChjc3VtbWFyeV9QbGFjZW50YV9QUkVET19uKSArCiAgZ2dwbG90Mjo6dGhlbWVfYncoKSsKICBnZ3Bsb3QyOjphZXMoeCA9IG56ZXJvLCB5ID0gbWVkaWFuX2N2bSkgKwogIGdncGxvdDI6OnNjYWxlX3hfY29udGludW91cyhicmVha3M9YygwOjE3KSkrCiAgZ2dwbG90Mjo6Z2VvbV9wb2ludCgpICsgZ2dwbG90Mjo6Z2VvbV9saW5lKCkrCiAgZ2dwbG90Mjo6Z2VvbV9wb2ludChkYXRhPW56ZXJvX2luZGljZXNfUGxhY2VudGFfUFJFRE8sIGFlcyh4PXgsIHk9eSksIGNvbG91cj0icmVkIiwgc2l6ZT0yKSsKICBnZ3Bsb3QyOjp5bGFiKCJtZWRpYW4gb2YgbWluaW11bSBjcm9zcy12YWxpZGF0aW9uIGVycm9ycyBvdmVyIGJvb3RzdHJhcHMiKSsKICBnZ3Bsb3QyOjp4bGFiKCJudW1iZXIgb2Ygbm9uLXplcm8gY29lZmZpY2llbnRzIikrCiAgZ2dwbG90Mjo6Z2VvbV9zZWdtZW50KGFlcyh4ID0gbnplcm9bMV0sIHkgPSBtZWRpYW5fY3ZtWzFdLCB4ZW5kID0gbnplcm9bMTRdLCB5ZW5kID0gbWVkaWFuX2N2bVsxNF0sIGNvbG91ciA9ICJzZWdtZW50IiksIGRhdGEgPSBjc3VtbWFyeV9QbGFjZW50YV9QUkVET19uLCBzaG93LmxlZ2VuZCA9IEYpCgpub256ZXJvX2Nob29zZV9QbGFjZW50YV9QUkVETwpgYGAKCmBgYHtyfQpwbmcoZmlsZW5hbWU9IlJlc3VsdHMvRmlndXJlcy9lbGFzdGljTmV0X3NpbmdsZVRpc3N1ZXMvT3V0Y29tZV9tYWluL256ZXJvX2Nob29zZV9QbGFjZW50YV9QUkVETy5wbmciLCB3aWR0aD0xNjAwLCBoZWlnaHQ9MTQwMCwgcmVzPTMwMCkKbm9uemVyb19jaG9vc2VfUGxhY2VudGFfUFJFRE8KZGV2Lm9mZigpCmBgYAoKYGBge3J9CnN1bW1hcnlfUGxhY2VudGFfUFJFRE9fbl9maW5hbG56ZXJvIDwtIGNzdW1tYXJ5X1BsYWNlbnRhX1BSRURPX25bbnplcm8gJWluJSBuemVyb19maW5hbF9wbGFjZW50YV9wcmVkb10Kc2lnX3Zhcl9uYW1lc19QbGFjZW50YV9QUkVET19uX2ZpbmFsbnplcm8gPC0gRmlsdGVyKGZ1bmN0aW9uKHgpIGFueSh4ID4gMC43NSksIHN1bW1hcnlfUGxhY2VudGFfUFJFRE9fbl9maW5hbG56ZXJvWywhYygibnplcm8iLCAibWVhbl9jdm0iLCAibWVkaWFuX2N2bSIpXSkgJT4lIGNvbG5hbWVzKCkKY29sbmFtZXMoc3VtbWFyeV9QbGFjZW50YV9QUkVET19uX2ZpbmFsbnplcm8pIDwtIGMoIm5vbi16ZXJvIiwiY2hpbGQgc2V4IiwgImJpcnRoIHdlaWdodCIsICJiaXJ0aCBsZW5ndGgiLCAiaGVhZCBjaXJjdW1mZXJlbmNlIiwgImRlbGl2ZXJ5IG1vZGUgKGFpZGVkKSIsICJpbmR1Y2VkIGxhYm9yICh5ZXMpIiwgInBhcml0eSAoYmlydGggYmVmb3JlKSIsICJtYXRlcm5hbCBhZ2UiLCAibWF0ZXJuYWwgQk1JIiwgIm1hdGVybmFsIGh5cGVydGVuc2lvbiAoeWVzKSIsICJtYXRlcm5hbCBkaWFiZXRlcyAoeWVzKSIsICJtYXRlcm5hbCBtZW50YWwgZGlzb3JkZXJzICh5ZXMpIiwgIm1hdGVybmFsIHNtb2tpbmcgKHllcykiLCAibWVhbiBjdm0iLCAibWVkaWFuIGN2bSIpCnN1bW1hcnlfUGxhY2VudGFfUFJFRE9fbl9maW5hbG56ZXJvVCA8LSBhcy5kYXRhLmZyYW1lKHQoc3VtbWFyeV9QbGFjZW50YV9QUkVET19uX2ZpbmFsbnplcm9bLC1jKCJub24temVybyIsICJtZWRpYW4gY3ZtIiwgIm1lYW4gY3ZtIildKSkKc3VtbWFyeV9QbGFjZW50YV9QUkVET19uX2ZpbmFsbnplcm9UJHZhcmlhYmxlIDwtIHJvd25hbWVzKHN1bW1hcnlfUGxhY2VudGFfUFJFRE9fbl9maW5hbG56ZXJvVCkKcm93bmFtZXMoc3VtbWFyeV9QbGFjZW50YV9QUkVET19uX2ZpbmFsbnplcm9UKSA8LSBOVUxMCm5hbWVzKHN1bW1hcnlfUGxhY2VudGFfUFJFRE9fbl9maW5hbG56ZXJvVClbbmFtZXMoc3VtbWFyeV9QbGFjZW50YV9QUkVET19uX2ZpbmFsbnplcm9UKSA9PSAnVjEnXSA8LSAncGVyY2VudCcKc3VtbWFyeV9QbGFjZW50YV9QUkVET19uX2ZpbmFsbnplcm9UIDwtIHN1bW1hcnlfUGxhY2VudGFfUFJFRE9fbl9maW5hbG56ZXJvVFtvcmRlcihzdW1tYXJ5X1BsYWNlbnRhX1BSRURPX25fZmluYWxuemVyb1QkcGVyY2VudCksXQoKc3VtbWFyeV9QbGFjZW50YV9QUkVET19uX2ZpbmFsbnplcm9UJG51bWJlciA8LSBzZXEoMSwgbGVuZ3RoKHN1bW1hcnlfUGxhY2VudGFfUFJFRE9fbl9maW5hbG56ZXJvVCR2YXJpYWJsZSkpCmBgYAoKYGBge3IsIGZpZy53aWR0aD04fQpwZXJjX3ZhcnNfUGxhY2VudGFfUFJFRE9fbiA8LSAKICBnZ3Bsb3Qoc3VtbWFyeV9QbGFjZW50YV9QUkVET19uX2ZpbmFsbnplcm9ULCBhZXMocmVvcmRlcih2YXJpYWJsZSwgcGVyY2VudCksIHBlcmNlbnQsIGdyb3VwPTEpKSsKICBnZW9tX3BvaW50KCkrIGdlb21fbGluZSgpKwogIHlsYWIoIiUgb2NjdXJlbmNlIGluIG1vZGVscyB3aXRoIG56ZXJvIGNvZWZmaWNpZW50cyA9IDUiKSsKICBzY2FsZV95X2NvbnRpbnVvdXMoYnJlYWtzPWMoMC4xLDAuMiwwLjMsMC40LDAuNSwwLjYsMC43LDAuOCwwLjkpKSsKICB4bGFiKCJ2YXJpYWJsZSIpKwogIGNvb3JkX2ZsaXAoKSsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQ9MC43NSwgbGluZXR5cGU9ImRvdHRlZCIpKwogIHRoZW1lX2J3KCkKCnBlcmNfdmFyc19QbGFjZW50YV9QUkVET19uCgojIGRlY2lkZSBmb3IgY3V0LW9mZiAlIC0+IGhlcmUgLjc1CgpGaWx0ZXIoZnVuY3Rpb24oeCkgYW55KHggPiAwLjc1KSwgc3VtbWFyeV9QbGFjZW50YV9QUkVET19uX2ZpbmFsbnplcm9bLCFjKCJub24temVybyIsICJtZWFuIGN2bSIsICJtZWRpYW4gY3ZtIildKQoKYGBgCgpgYGB7cn0KcG5nKGZpbGVuYW1lPSJSZXN1bHRzL0ZpZ3VyZXMvZWxhc3RpY05ldF9zaW5nbGVUaXNzdWVzL091dGNvbWVfbWFpbi92YXJzUGVyY2VudF9QbGFjZW50YV9QUkVETy5wbmciLCB3aWR0aD0xMTAwLCBoZWlnaHQ9MTQwMCwgcmVzPTQwMCkKcGVyY192YXJzX1BsYWNlbnRhX1BSRURPX24KZGV2Lm9mZigpCmBgYAoKCmBgYHtyfQpwbTJfUGxhY2VudGFfUFJFRE9fbl9jb2VmIDwtCiAgZGNhc3QocG0yX1BsYWNlbnRhX1BSRURPX25bLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzLmxpc3QodW5saXN0KAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwcGx5KC5TRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbih4KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5IDwtIHVubmFtZShxdWFudGlsZSh4W3ggIT0gMF0sIHByb2JzID0gYygwLjAyNSwgMC45NzUpKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3QoIm5vbl96ZXJvIiA9IDEwMCAqIG1lYW4oeCAhPSAwKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGNsID0geVsxXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWNsID0geVsyXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGggPSBkaWZmKHkpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYW4gPSBtZWRpYW4oeFt4IT0gMF0pKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLlNEY29scyA9IGMoIkNoaWxkX1NleGZlbWFsZSIsICJCaXJ0aF9XZWlnaHQiLCAiQmlydGhfTGVuZ3RoIiwgIkhlYWRfQ2lyY3VtZmVyZW5jZV9hdF9CaXJ0aCIsICJEZWxpdmVyeV9Nb2RlX2RpY2hvdG9tYWlkZWQiLCAiaW5kdWNlZGxhYm91clllcyIsICJQYXJpdHlfZGljaG90b21naXZlbiBiaXJ0aCBiZWZvcmUiLCAiTWF0ZXJuYWxfQWdlXzE4UG9wUmVnYW5kQlIiLCAiTWF0ZXJuYWxfUHJlcHJlZ25hbmN5Qk1JMThvY3QyOG5ldyIsICJtYXRlcm5hbF9oeXBlcnRlbnNpb25fZGljaG90b21oeXBlcnRlbnNpb24gaW4gY3VycmVudCBwcmVnbmFuY3kiLCJtYXRlcm5hbF9kaWFiZXRlc19kaWNob3RvbWRpYWJldGVzIGluIGN1cnJlbnQgcHJlZ25hbmN5IiwiTWF0ZXJuYWxfTWVudGFsX0Rpc29yZGVyc19CeV9DaGlsZGJpcnRoWWVzIiwic21va2luZ19kaWNob3RvbXllcyIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5ID0gbnplcm9dW29yZGVyKG56ZXJvKV0gJT4lCiAgICAgICAgICBtZWx0KGlkLnZhciA9ICJuemVybyIpICU+JQogICAgICAgICAgLlssIG1ldHJpYyA6PSBzdWIoIl4uK1xcLiguKykkIiwgIlxcMSIsIHZhcmlhYmxlKV0gJT4lCiAgICAgICAgICAuWywgdmFyaWFibGUgOj0gc3ViKCJeKC4rKVxcLi4rJCIsICJcXDEiLCB2YXJpYWJsZSldICU+JQogICAgICAgICAgLltuemVybyA9PW56ZXJvX2ZpbmFsX3BsYWNlbnRhX3ByZWRvXSwgbnplcm8rIHZhcmlhYmxlIH4gbWV0cmljLCB2YWx1ZS52YXI9InZhbHVlIikKCiMgZ2V0IGRlc2lyZWQgb3JkZXIgb2YgcHJlZGljdG9ycwpwbTJfUGxhY2VudGFfUFJFRE9fbl9jb2VmIDwtCiAgcG0yX1BsYWNlbnRhX1BSRURPX25fY29lZlttYXRjaChjKCJDaGlsZF9TZXhmZW1hbGUiLCAiQmlydGhfV2VpZ2h0IiwgIkJpcnRoX0xlbmd0aCIsICJIZWFkX0NpcmN1bWZlcmVuY2VfYXRfQmlydGgiLCAiRGVsaXZlcnlfTW9kZV9kaWNob3RvbWFpZGVkIiwgImluZHVjZWRsYWJvdXJZZXMiLCAiUGFyaXR5X2RpY2hvdG9tZ2l2ZW4gYmlydGggYmVmb3JlIiwgIk1hdGVybmFsX0FnZV8xOFBvcFJlZ2FuZEJSIiwgIk1hdGVybmFsX1ByZXByZWduYW5jeUJNSTE4b2N0MjhuZXciLCAibWF0ZXJuYWxfaHlwZXJ0ZW5zaW9uX2RpY2hvdG9taHlwZXJ0ZW5zaW9uIGluIGN1cnJlbnQgcHJlZ25hbmN5IiwibWF0ZXJuYWxfZGlhYmV0ZXNfZGljaG90b21kaWFiZXRlcyBpbiBjdXJyZW50IHByZWduYW5jeSIsIk1hdGVybmFsX01lbnRhbF9EaXNvcmRlcnNfQnlfQ2hpbGRiaXJ0aFllcyIsInNtb2tpbmdfZGljaG90b215ZXMiKSwgcG0yX1BsYWNlbnRhX1BSRURPX25fY29lZiR2YXJpYWJsZSksXQpwbTJfUGxhY2VudGFfUFJFRE9fbl9jb2VmJHZhcmlhYmxlIDwtIGZhY3RvcihwbTJfUGxhY2VudGFfUFJFRE9fbl9jb2VmJHZhcmlhYmwsIGxldmVscz11bmlxdWUocG0yX1BsYWNlbnRhX1BSRURPX25fY29lZiR2YXJpYWJsZSkpCgojIyBOT1RFOiBtZWRpYW4gaXMgdXNlZCBoZXJlIGluc3RlYWQgb2YgbWVhbgojIG1ha2UgZnJhbWUgZm9yIG9ubHkgc2lnbmlmaWNhbnQgdmFyaWFibGVzOgpwbTJfUGxhY2VudGFfUFJFRE9fbl9kYXRhYmxlIDwtIGRjYXN0KHBtMl9QbGFjZW50YV9QUkVET19uWywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcy5saXN0KHVubGlzdCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcHBseSguU0QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24oeCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeSA8LSB1bm5hbWUocXVhbnRpbGUoeFt4ICE9IDBdLCBwcm9icyA9IGMoMC4wMjUsIDAuOTc1KSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0KCJub25femVybyIgPSAxMDAgKiBtZWFuKHggIT0gMCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxjbCA9IHlbMV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVjbCA9IHlbMl0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoID0gZGlmZih5KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFuID0gbWVkaWFuKHhbeCE9IDBdKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSkpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5TRGNvbHMgPSBjKCJDaGlsZF9TZXhmZW1hbGUiLCAiQmlydGhfV2VpZ2h0IiwgIkJpcnRoX0xlbmd0aCIsICJIZWFkX0NpcmN1bWZlcmVuY2VfYXRfQmlydGgiLCAiRGVsaXZlcnlfTW9kZV9kaWNob3RvbWFpZGVkIiwgImluZHVjZWRsYWJvdXJZZXMiLCAiUGFyaXR5X2RpY2hvdG9tZ2l2ZW4gYmlydGggYmVmb3JlIiwgIk1hdGVybmFsX0FnZV8xOFBvcFJlZ2FuZEJSIiwgIk1hdGVybmFsX1ByZXByZWduYW5jeUJNSTE4b2N0MjhuZXciLCAibWF0ZXJuYWxfaHlwZXJ0ZW5zaW9uX2RpY2hvdG9taHlwZXJ0ZW5zaW9uIGluIGN1cnJlbnQgcHJlZ25hbmN5IiwibWF0ZXJuYWxfZGlhYmV0ZXNfZGljaG90b21kaWFiZXRlcyBpbiBjdXJyZW50IHByZWduYW5jeSIsIk1hdGVybmFsX01lbnRhbF9EaXNvcmRlcnNfQnlfQ2hpbGRiaXJ0aFllcyIsInNtb2tpbmdfZGljaG90b215ZXMiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieSA9IG56ZXJvXVtvcmRlcihuemVybyldICU+JQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVsdChpZC52YXIgPSAibnplcm8iKSAlPiUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5bLCBtZXRyaWMgOj0gc3ViKCJeLitcXC4oLispJCIsICJcXDEiLCB2YXJpYWJsZSldICU+JQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLlssIHZhcmlhYmxlIDo9IHN1YigiXiguKylcXC4uKyQiLCAiXFwxIiwgdmFyaWFibGUpXSAlPiUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgcHJpbnQgJT4lCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuW256ZXJvID09IG56ZXJvX2ZpbmFsX3BsYWNlbnRhX3ByZWRvICYgdmFyaWFibGUgJWluJSBzaWdfdmFyX25hbWVzX1BsYWNlbnRhX1BSRURPX25fZmluYWxuemVyb10sIG56ZXJvKyB2YXJpYWJsZSB+IG1ldHJpYywgdmFsdWUudmFyPSJ2YWx1ZSIpCnBtMl9QbGFjZW50YV9QUkVET19uX2NvZWYKYGBgCgoKYGBge3J9CndyaXRlX3hsc3gocG0yX1BsYWNlbnRhX1BSRURPX25fY29lZiwiUmVzdWx0cy9UYWJsZXMvQ29lZmZpY2llbnRzTW9kZWxfUGxhY2VudGFfUFJFRE8ueGxzeCIpCmBgYAoKYGBge3J9CnNpZ192YXJzX1BsYWNlbnRhX1BSRURPX24gPC0KICBwbTJfUGxhY2VudGFfUFJFRE9fbl9jb2VmICU+JQogIGdncGxvdDI6OmdncGxvdCguKSArCiAgZ2dwbG90Mjo6dGhlbWVfYncoKSArCiAgZ2dwbG90Mjo6dGhlbWUoYXhpcy50ZXh0Lng9ZWxlbWVudF9ibGFuaygpKSsKICBnZ3Bsb3QyOjphZXMoeD0ibnplcm8iKSsKICBnZ3Bsb3QyOjpnZW9tX3BvaW50KG1hcHBpbmcgPSBnZ3Bsb3QyOjphZXMoeSA9IHZhcmlhYmxlLCBzaXplID1ub25femVybywgYWxwaGEgPSBub25femVybywgY29sb3IgPSBub25femVybykpICsKICBnZ3Bsb3QyOjpnZW9tX3RleHQoYWVzKHk9dmFyaWFibGUsIGxhYmVsPXNwcmludGYoIiUwLjJmIiwgcm91bmQobWVkaWFuLCBkaWdpdHM9MikpLCBzaXplPTUwKSxoanVzdD0wLCB2anVzdD0wLjUsIG51ZGdlX3ggPSAwLjEpKwogIGdncGxvdDI6OnNjYWxlX2NvbG9yX2dyYWRpZW50MihoaWdoID0gJ2dyZWVuJywgbWlkID0gInB1cnBsZSIsIGxvdyA9ICJibGFjayIsIG1pZHBvaW50ID01MCkrCiAgZ2dwbG90Mjo6c2NhbGVfYWxwaGEoZ3VpZGUgPSAnbm9uZScpKwogIGdncGxvdDI6OnNjYWxlX3NpemUoZ3VpZGUgPSAnbm9uZScpKwogIGdncGxvdDI6OnNjYWxlX3lfZGlzY3JldGUobGFiZWxzPSBjKCJjaGlsZCBzZXgiLCAiYmlydGggd2VpZ2h0IiwgImJpcnRoIGxlbmd0aCIsICJoZWFkIGNpcmN1bWZlcmVuY2UiLCAiZGVsaXZlcnkgbW9kZSAoYWlkZWQpIiwgImluZHVjZWQgbGFib3IgKHllcykiLCAicGFyaXR5IChiaXJ0aCBiZWZvcmUpIiwgIm1hdGVybmFsIGFnZSIsICJtYXRlcm5hbCBCTUkiLCAibWF0ZXJuYWwgaHlwZXJ0ZW5zaW9uICh5ZXMpIiwgIm1hdGVybmFsIGRpYWJldGVzICh5ZXMpIiwgIm1hdGVybmFsIG1lbnRhbCBkaXNvcmRlcnMgKHllcykiLCAibWF0ZXJuYWwgc21va2luZyAoeWVzKSIpKSsKICBnZ3Bsb3QyOjpsYWJzKHk9InByZWRpY3RvciIsIHggPSAibnVtYmVyIG9mIG5vbi16ZXJvIGNvZWZmaWNpZW50cyA9IDUiLCBjb2xvcj0iJSIpCgpgYGAKCmBgYHtyfQpjb2VmX1BsYWNlbnRhX1BSRURPX24gPC0gCiAgZ2dwbG90KHBtMl9QbGFjZW50YV9QUkVET19uX2NvZWYsIGFlcyh5ID0gdmFyaWFibGUsIHg9bWVkaWFuKSkrCiAgZ2VvbV9wb2ludChtYXBwaW5nID0gZ2dwbG90Mjo6YWVzKHkgPSB2YXJpYWJsZSwgc2l6ZSA9bm9uX3plcm8sIGFscGhhID0gbm9uX3plcm8sIGNvbG9yID0gbm9uX3plcm8pKSsKICBzY2FsZV9jb2xvcl9ncmFkaWVudDIoaGlnaCA9ICdncmVlbicsIG1pZCA9ICJwdXJwbGUiLCBsb3cgPSAiYmxhY2siLCBtaWRwb2ludCA9NTAsIGxpbWl0cz1jKDAsMTAwKSkrCiAgc2NhbGVfYWxwaGEoZ3VpZGUgPSAnbm9uZScpKwogIHNjYWxlX3NpemUoZ3VpZGUgPSAnbm9uZScpKwogIGdlb21fcG9pbnQoKSsKICBnZW9tX2Vycm9yYmFyKGFlcyh5ID0gdmFyaWFibGUsIHhtaW4gPSBsY2wsIHhtYXggPSB1Y2wpLCB3aWR0aCA9IDAuMikrCiAgbGFicyh5PSJwcmVkaWN0b3IiLCB4ID0gIlxubWVkaWFuICYgOTUlIENJIG9mIGNvZWZmaWNpZW50IChvdmVyIGJvb3RzdHJhcHMpIiwgY29sb3I9IiUiKSsKICBzY2FsZV94X2NvbnRpbnVvdXMobGltaXRzPWMoLTAuNSwwLjQpLCBicmVha3M9YygtLjQsLS4zLC0uMiwgLS4xLCAwLCAuMSwgLjIsIC4zLCAuNCkpKwogIHNjYWxlX3lfZGlzY3JldGUobGFiZWxzPSBjKCJjaGlsZCBzZXggKGZlbWFsZSkiLCAiYmlydGggd2VpZ2h0IiwgImJpcnRoIGxlbmd0aCIsICJoZWFkIGNpcmN1bWZlcmVuY2UiLCAiZGVsaXZlcnkgbW9kZSAoYWlkZWQpIiwgImluZHVjZWQgbGFib3IgKHllcykiLCAicGFyaXR5IChiaXJ0aCBiZWZvcmUpIiwgIm1hdGVybmFsIGFnZSIsICJtYXRlcm5hbCBCTUkiLCAibWF0ZXJuYWwgaHlwZXJ0ZW5zaW9uICh5ZXMpIiwgIm1hdGVybmFsIGRpYWJldGVzICh5ZXMpIiwgIm1hdGVybmFsIG1lbnRhbCBkaXNvcmRlcnMgKHllcykiLCAibWF0ZXJuYWwgc21va2luZyAoeWVzKSIpKSsKICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQ9MCwgbGluZXR5cGU9ImRhc2hlZCIpKwogIHRoZW1lX2J3KCkrCiAgdGhlbWUodGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTUpLCBheGlzLnRpdGxlLng9IGVsZW1lbnRfdGV4dChzaXplPTE1KSwgYXhpcy50aXRsZS55PSBlbGVtZW50X3RleHQoc2l6ZT0xNSkpCgoKY29lZl9QbGFjZW50YV9QUkVET19uCmBgYAoKCmBgYHtyfQpwbmcoZmlsZW5hbWU9IlJlc3VsdHMvRmlndXJlcy9lbGFzdGljTmV0X3NpbmdsZVRpc3N1ZXMvT3V0Y29tZV9tYWluL2NvZWZfUGxhY2VudGFfUFJFRE8ucG5nIiwgd2lkdGg9MjgwMCwgaGVpZ2h0PTE0MDAsIHJlcz00MDApCmNvZWZfUGxhY2VudGFfUFJFRE9fbgpkZXYub2ZmKCkKYGBgCgoKYGBge3J9CnAxIDwtCiAgY3N1bW1hcnlfUGxhY2VudGFfUFJFRE9fbiAlPiUKICBtZWx0KGlkLnZhcnMgPSBjKCJuemVybyIsICJtZWFuX2N2bSIsICJtZWRpYW5fY3ZtIikpICU+JQogIGdncGxvdDI6OmdncGxvdCguKSArCiAgZ2dwbG90Mjo6dGhlbWVfYncoKSArCiAgZ2dwbG90Mjo6YWVzKHggPSBuemVybykgKwogIGdncGxvdDI6Omdlb21fcG9pbnQobWFwcGluZyA9IGdncGxvdDI6OmFlcyh5ID0gdmFyaWFibGUsIHNpemUgPSB2YWx1ZSwgYWxwaGEgPSB2YWx1ZSwgY29sb3IgPSB2YWx1ZSoxMDApKSArCiAgZ2dwbG90Mjo6c2NhbGVfY29sb3JfZ3JhZGllbnQyKGhpZ2ggPSAnZ3JlZW4nLCBtaWQgPSAicHVycGxlIiwgbG93ID0gImJsYWNrIiwgbWlkcG9pbnQgPTUwKSsKICBnZ3Bsb3QyOjpzY2FsZV9hbHBoYShndWlkZSA9ICdub25lJykrCiAgZ2dwbG90Mjo6c2NhbGVfc2l6ZShndWlkZSA9ICdub25lJykrCiAgZ2dwbG90Mjo6c2NhbGVfeV9kaXNjcmV0ZShsYWJlbHM9IGMoImNoaWxkIHNleCAoZmVtYWxlKSIsICJiaXJ0aCB3ZWlnaHQiLCAiYmlydGggbGVuZ3RoIiwgImhlYWQgY2lyY3VtZmVyZW5jZSIsICJkZWxpdmVyeSBtb2RlIChhaWRlZCkiLCAiaW5kdWNlZCBsYWJvciAoeWVzKSIsICJwYXJpdHkgKGJpcnRoIGJlZm9yZSkiLCAibWF0ZXJuYWwgYWdlIiwgIm1hdGVybmFsIEJNSSIsICJtYXRlcm5hbCBoeXBlcnRlbnNpb24gKHllcykiLCAibWF0ZXJuYWwgZGlhYmV0ZXMgKHllcykiLCAibWF0ZXJuYWwgbWVudGFsIGRpc29yZGVycyAoeWVzKSIsICJtYXRlcm5hbCBzbW9raW5nICh5ZXMpIikpKwogIGdncGxvdDI6OnNjYWxlX3hfY29udGludW91cyhicmVha3M9MDoxNCwgbGFiZWxzPSkrCiAgZ2dwbG90Mjo6bGFicyh5PSJwcmVkaWN0b3IiLCB4ID0gIlxubnVtYmVyIG9mIG5vbi16ZXJvIGNvZWZmaWNpZW50cyIsIGNvbG9yPSIlIikrCiAgZ2dwbG90Mjo6dGhlbWUodGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTcpLCBheGlzLnRpdGxlLng9IGVsZW1lbnRfdGV4dChzaXplPTE1KSwgYXhpcy50aXRsZS55PSBlbGVtZW50X3RleHQoc2l6ZT0xNSksIGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikKICAKcDIgPC0gCiAgZ2dwbG90KHBtMl9QbGFjZW50YV9QUkVET19uX2NvZWYsIGFlcyh5ID0gdmFyaWFibGUsIHg9bWVkaWFuKSkrCiAgZ2VvbV9wb2ludChtYXBwaW5nID0gZ2dwbG90Mjo6YWVzKHkgPSB2YXJpYWJsZSwgc2l6ZSA9bm9uX3plcm8sIGFscGhhID0gbm9uX3plcm8sIGNvbG9yID0gbm9uX3plcm8pKSsKICBzY2FsZV9jb2xvcl9ncmFkaWVudDIoaGlnaCA9ICdncmVlbicsIG1pZCA9ICJwdXJwbGUiLCBsb3cgPSAiYmxhY2siLCBtaWRwb2ludCA9NTAsIGxpbWl0cz1jKDAsMTAwKSkrCiAgc2NhbGVfYWxwaGEoZ3VpZGUgPSAnbm9uZScpKwogIHNjYWxlX3NpemUoZ3VpZGUgPSAnbm9uZScpKwogIGdlb21fcG9pbnQoKSsKICBnZW9tX2Vycm9yYmFyKGFlcyh5ID0gdmFyaWFibGUsIHhtaW4gPSBsY2wsIHhtYXggPSB1Y2wpLCB3aWR0aCA9IDAuMikrCiAgbGFicyh5PSIiLCB4ID0gIlxubWVkaWFuICYgOTUlIENJIG9mIGNvZWZmaWNpZW50IChvdmVyIGJvb3RzdHJhcHMpIiwgY29sb3I9IiUiKSsKICBzY2FsZV94X2NvbnRpbnVvdXMobGltaXRzPWMoLTAuNSwwLjQpLCBicmVha3M9YygtLjQsLS4zLC0uMiwgLS4xLCAwLCAuMSwgLjIsIC4zLCAuNCkpKwogIHNjYWxlX3lfZGlzY3JldGUobGFiZWxzPSBjKCJjaGlsZCBzZXggKGZlbWFsZSkiLCAiYmlydGggd2VpZ2h0IiwgImJpcnRoIGxlbmd0aCIsICJoZWFkIGNpcmN1bWZlcmVuY2UiLCAiZGVsaXZlcnkgbW9kZSAoYWlkZWQpIiwgImluZHVjZWQgbGFib3IgKHllcykiLCAicGFyaXR5IChiaXJ0aCBiZWZvcmUpIiwgIm1hdGVybmFsIGFnZSIsICJtYXRlcm5hbCBCTUkiLCAibWF0ZXJuYWwgaHlwZXJ0ZW5zaW9uICh5ZXMpIiwgIm1hdGVybmFsIGRpYWJldGVzICh5ZXMpIiwgIm1hdGVybmFsIG1lbnRhbCBkaXNvcmRlcnMgKHllcykiLCAibWF0ZXJuYWwgc21va2luZyAoeWVzKSIpKSsKICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQ9MCwgbGluZXR5cGU9ImRhc2hlZCIpKwogIHRoZW1lX2J3KCkrCiAgZ2d0aXRsZSgibnplcm8gPSA2IikrCiAgdGhlbWUodGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTcpLCBheGlzLnRpdGxlLng9IGVsZW1lbnRfdGV4dChzaXplPTE1KSwgYXhpcy50aXRsZS55PSBlbGVtZW50X3RleHQoc2l6ZT0xNSksIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZT0xNSksIGF4aXMudGV4dC55PWVsZW1lbnRfYmxhbmsoKSkKCmcxIDwtIGdncGxvdEdyb2IocDEpCmcyIDwtIGdncGxvdEdyb2IocDIpCmcgPC0gY2JpbmQoZzEsIGcyLCBzaXplID0gImxhc3QiKQpnJGhlaWdodHMgPC0gdW5pdC5wbWF4KGcxJGhlaWdodHMsIGcyJGhlaWdodHMpCgpwbmcoZmlsZW5hbWU9IlJlc3VsdHMvRmlndXJlcy9lbGFzdGljTmV0X3NpbmdsZVRpc3N1ZXMvT3V0Y29tZV9tYWluL01vZGVsX2NvZWZfUGxhY2VudGFfUFJFRE8ucG5nIiwgd2lkdGg9NTgwMCwgaGVpZ2h0PTE2MDAsIHJlcz00MDApCmdyaWQuZHJhdyhnKQpkZXYub2ZmKCkKYGBgCgpbdG8gdGhlIHRvcF0oI3RvcCkKCiMjIFBsYWNlbnRhIGVsYXN0aWMgbmV0IHsjZWxhc3RpY25ldFBsYWNlbnRhUFJFRE9fYX0gIAoKIApgYGB7cn0KIyBpbiBjYXNlIHlvdSB3YW50IHRvIHN0YXJ0IGZyb20gaGVyZQpsb2FkKCJJbnB1dERhdGEvQ2xvY2tDYWxjdWxhdGlvbnNJbnB1dC9SZWdfSW5wdXRfRGF0YV9QbGFjZW50YV9QUkVET19FQUFSX25vTmFfd2EuUmRhdGEiKQpgYGAKCmBgYHtyfQp5cmNfbWF0X1BSRURPX1BsYWNlbnRhX3dhIDwtIG1hdHJpeChSZWdfSW5wdXRfRGF0YV9QbGFjZW50YV9QUkVET19FQUFSX25vTmFfd2EkRUFBUl9MZWUpCnhyY19tYXRfUFJFRE9fUGxhY2VudGFfd2EgPC0gbW9kZWwubWF0cml4KCB+IC4gLSBFQUFSX0xlZSwgZGF0YSA9IFJlZ19JbnB1dF9EYXRhX1BsYWNlbnRhX1BSRURPX0VBQVJfbm9OYV93YSlbLCAtMV0KeXJjX21hdF9QUkVET19zY2FsZWRfUGxhY2VudGFfd2EgPC0gc2NhbGUoeXJjX21hdF9QUkVET19QbGFjZW50YV93YSkKeHJjX21hdF9QUkVET19zY2FsZWRfUGxhY2VudGFfd2EgPC0gc2NhbGUoeHJjX21hdF9QUkVET19QbGFjZW50YV93YSkKYGBgCgo8IS0tIHNldCBzZWVkIC0tPgo8IS0tIGBgYHtyfSAtLT4KPCEtLSBzZXQuc2VlZCgyMDIwKSAtLT4KPCEtLSBgYGAgLS0+CgoKPCEtLSBgYGB7ciwgd2FybmluZz1GfSAtLT4KPCEtLSAgIG5ib290ID0gMTAwMCAtLT4KCjwhLS0gICBzdGFydF90aW1lIDwtIFN5cy50aW1lKCkgLS0+CjwhLS0gICBib290c3RyYXBzX1BsYWNlbnRhX1BSRURPX3dhIDwtIHJlcGxpY2F0ZShuYm9vdCwgeyAtLT4KPCEtLSAgICAgcndzIDwtIHNhbXBsZSgxOm5yb3coeHJjX21hdF9QUkVET19zY2FsZWRfUGxhY2VudGFfd2EpLCByZXBsYWNlID0gVFJVRSkgLS0+CjwhLS0gICAgIGVuc3IoeHJjX21hdF9QUkVET19zY2FsZWRfUGxhY2VudGFfd2FbcndzLCBdLCB5cmNfbWF0X1BSRURPX3NjYWxlZF9QbGFjZW50YV93YVtyd3MsIF0sIHN0YW5kYXJkaXplZCA9IEZBTFNFLCBmYW1pbHk9ImdhdXNzaWFuIiwgbmxhbWJkYT0xMDAsIG5mb2xkcz0xMCwgYWxwaGE9YygwLjAsMC4xLDAuMiwwLjMsMC40LDAuNSwwLjYsMC43LDAuOCwwLjksMS4wKSkgLS0+CjwhLS0gICB9LCAtLT4KPCEtLSAgIHNpbXBsaWZ5ID0gRkFMU0UpIC0tPgoKPCEtLSAgIGVuZF90aW1lIDwtIFN5cy50aW1lKCkgLS0+CjwhLS0gICBlbmRfdGltZSAtIHN0YXJ0X3RpbWUgLS0+Cgo8IS0tICAgI1RpbWUgZGlmZmVyZW5jZSBvZiAzLjE1OTMxOSBob3VycyAtLT4KCjwhLS0gYGBgIC0tPgoKPCEtLSBgYGB7cn0gLS0+CjwhLS0gc2F2ZShib290c3RyYXBzX1BsYWNlbnRhX1BSRURPX3dhLCBmaWxlPSJJbnB1dERhdGEvRGF0YV9FbGFzdGljTmV0cy9ib290c3RyYXBzX1BsYWNlbnRhX1BSRURPX3dhXzEwMDAuUmRhdGEiKSAtLT4KPCEtLSBgYGAgLS0+CgoKYGBge3J9CmxvYWQoIklucHV0RGF0YS9EYXRhX0VsYXN0aWNOZXRzL2Jvb3RzdHJhcHNfUGxhY2VudGFfUFJFRE9fd2FfMTAwMC5SZGF0YSIpCmBgYAoKYGBge3J9CnN1bW1hcmllc19QbGFjZW50YV9QUkVET193YSA8LQogIGJvb3RzdHJhcHNfUGxhY2VudGFfUFJFRE9fd2EgJT4lCiAgbGFwcGx5KHN1bW1hcnkpICU+JQogIHJiaW5kbGlzdChpZGNvbCA9ICJib290c3RyYXAiKQoKc3VtbWFyaWVzX1BsYWNlbnRhX1BSRURPX3dhCmBgYAoKYGBge3J9CnN1bW1hcmllc19QbGFjZW50YV9QUkVET193YVssIC5TRFtjdm0gPT0gbWluKGN2bSldLCBieSA9IGMoImJvb3RzdHJhcCIsICJuemVybyIpXSAlPiUKICBnZ3Bsb3QyOjpnZ3Bsb3QoZGF0YSA9IC4pICsKICBnZ3Bsb3QyOjphZXMoeCA9IG56ZXJvLCB5ID0gY3ZtLCBncm91cCA9IGJvb3RzdHJhcCkgKwogIGdncGxvdDI6Omdlb21fcG9pbnQoKSArCiAgZ2dwbG90Mjo6Z2VvbV9saW5lKCkKYGBgCgpgYGB7cn0KcG5nKGZpbGVuYW1lPSJSZXN1bHRzL0ZpZ3VyZXMvZWxhc3RpY05ldF9zaW5nbGVUaXNzdWVzL091dGNvbWVfYWRkL2FsY29ob2wvYm9vdHN0cmFwc19QbGFjZW50YV9QUkVETy5wbmciLCB3aWR0aD04MDAsIGhlaWdodD02MDApCnN1bW1hcmllc19QbGFjZW50YV9QUkVET193YVssIC5TRFtjdm0gPT0gbWluKGN2bSldLCBieSA9IGMoImJvb3RzdHJhcCIsICJuemVybyIpXSAlPiUKICBnZ3Bsb3QyOjpnZ3Bsb3QoZGF0YSA9IC4pICsKICBnZ3Bsb3QyOjphZXMoeCA9IG56ZXJvLCB5ID0gY3ZtLCBncm91cCA9IGJvb3RzdHJhcCkgKwogIGdncGxvdDI6Omdlb21fcG9pbnQoKSArCiAgZ2dwbG90Mjo6Z2VvbV9saW5lKCkKZGV2Lm9mZigpCmBgYAoKCjwhLS0gYGBge3IsIHdhcm5pbmc9RkFMU0V9IC0tPgo8IS0tICMgbG93ZXN0IGN2bSBieSBib290c3RyYXAgYW5kIG56ZXJvIC0tPgo8IS0tIHBtX1BsYWNlbnRhX1BSRURPX3dhIDwtIHN1bW1hcmllc19QbGFjZW50YV9QUkVET193YVssIC5TRFtjdm0gPT0gbWluKGN2bSldLCBieSA9IGMoImJvb3RzdHJhcCIsICJuemVybyIpXSAtLT4KPCEtLSBwbTJfUGxhY2VudGFfUFJFRE9fd2EgPC0gTlVMTCAtLT4KCjwhLS0gZm9yKGkgaW4gYXMuaW50ZWdlcihzZXEoMSwgbnJvdyhwbV9QbGFjZW50YV9QUkVET193YSksIGJ5ID0gMSkpKSB7IC0tPgo8IS0tICAgcG0yX1BsYWNlbnRhX1BSRURPX3dhIDwtIHJiaW5kKHBtMl9QbGFjZW50YV9QUkVET193YSwgLS0+CjwhLS0gICAgICAgICAgICAgICAgY2JpbmQocG1fUGxhY2VudGFfUFJFRE9fd2FbaSwgXSwgLS0+CjwhLS0gICAgICAgICAgICAgICAgdChhcy5tYXRyaXgoY29lZihib290c3RyYXBzX1BsYWNlbnRhX1BSRURPX3dhW1twbV9QbGFjZW50YV9QUkVET193YVtpLCBib290c3RyYXBdXV1bW3BtX1BsYWNlbnRhX1BSRURPX3dhW2ksIGxfaW5kZXhdXV0sIHMgPSBwbV9QbGFjZW50YV9QUkVET193YVtpLCBsYW1iZGFdKSkpIC0tPgo8IS0tICAgICAgICAgICAgICAgICkgLS0+CjwhLS0gICApIC0tPgo8IS0tIH0gLS0+Cgo8IS0tIHBtMl9QbGFjZW50YV9QUkVET193YSAtLT4KPCEtLSBgYGAgLS0+CgoKPCEtLSBgYGB7cn0gLS0+CjwhLS0gIyBzYXZlICJwcmVmZXJhYmxlIG1vZGVscyIgLS0+CjwhLS0gc2F2ZShwbTJfUGxhY2VudGFfUFJFRE9fd2EsIGZpbGU9IklucHV0RGF0YS9EYXRhX0VsYXN0aWNOZXRzL3BtMl9QbGFjZW50YV9QUkVET193YS5SZGF0YSIpIC0tPgo8IS0tIGBgYCAtLT4KCgpgYGB7cn0KbG9hZCgiSW5wdXREYXRhL0RhdGFfRWxhc3RpY05ldHMvcG0yX1BsYWNlbnRhX1BSRURPX3dhLlJkYXRhIikKIyBjb2VmZmljaWVudCB2YWx1ZXMgZm9yIHRoZSBtb2RlbHMgd2l0aCBzbWFsbGVzdCBjdm0gYnkgbnVtYmVyIG9mIG5vbi1lcnpvIGNvZWZmaWNpZW50cyBhbmQgYm9vdHN0cmFwCmBgYAoKbG9vayBob3cgb2Z0ZW4gYSBwYXJ0aWN1bGFyIHZhcmlhYmxlIGlzIGFzc29jaWF0ZWQgd2l0aCBhIG5vbi16ZXJvIGNvZWZmaWNpZW50IGluIGEgbW9kZWwgd2l0aCBhIGdpdmVuIG51bWJlciBvZiBub24temVybyBjb2VmZmljaWVudHMgKG92ZXIgYWxsIGJvb3RzdHJhcHMpCgpgYGB7cn0KY3N1bW1hcnlfUGxhY2VudGFfUFJFRE9fd2EgPC0gUmVkdWNlKGZ1bmN0aW9uKHgseSkgbWVyZ2UoeCA9IHgsIHkgPSB5LCBieSA9ICJuemVybyIpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdChwbTJfUGxhY2VudGFfUFJFRE9fd2FbLCBsYXBwbHkoLlNELCBmdW5jdGlvbih4KSB7bWVhbih4ICE9IDApfSksIC5TRGNvbHMgPSBjKCJDaGlsZF9TZXhmZW1hbGUiLCAiQmlydGhfV2VpZ2h0IiwgIkJpcnRoX0xlbmd0aCIsICJIZWFkX0NpcmN1bWZlcmVuY2VfYXRfQmlydGgiLCAiRGVsaXZlcnlfTW9kZV9kaWNob3RvbWFpZGVkIiwgImluZHVjZWRsYWJvdXJZZXMiLCAiUGFyaXR5X2RpY2hvdG9tZ2l2ZW4gYmlydGggYmVmb3JlIiwgIk1hdGVybmFsX0FnZV8xOFBvcFJlZ2FuZEJSIiwgIk1hdGVybmFsX1ByZXByZWduYW5jeUJNSTE4b2N0MjhuZXciLCAibWF0ZXJuYWxfaHlwZXJ0ZW5zaW9uX2RpY2hvdG9taHlwZXJ0ZW5zaW9uIGluIGN1cnJlbnQgcHJlZ25hbmN5IiwibWF0ZXJuYWxfZGlhYmV0ZXNfZGljaG90b21kaWFiZXRlcyBpbiBjdXJyZW50IHByZWduYW5jeSIsIk1hdGVybmFsX01lbnRhbF9EaXNvcmRlcnNfQnlfQ2hpbGRiaXJ0aFllcyIsInNtb2tpbmdfZGljaG90b215ZXMiLCAiQWxjb2hvbF9Vc2VfSW5fRWFybHlfUHJlZ25hbmN5XzE5T2N0eWVzIiksIGJ5ID0gbnplcm9dCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBtMl9QbGFjZW50YV9QUkVET193YVssIC4obWVhbl9jdm0gPSBtZWFuKGN2bSkpLCBieSA9IG56ZXJvXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbTJfUGxhY2VudGFfUFJFRE9fd2FbLCAuKG1lZGlhbl9jdm0gPSBtZWRpYW4oY3ZtKSksIGJ5ID0gbnplcm9dCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkpW29yZGVyKG56ZXJvKV0KCmNzdW1tYXJ5X1BsYWNlbnRhX1BSRURPX3dhCmBgYAoKCmBgYHtyfQpnMV9QbGFjZW50YV9QUkVET193YSA8LQogIGNzdW1tYXJ5X1BsYWNlbnRhX1BSRURPX3dhICU+JQogIG1lbHQoaWQudmFycyA9IGMoIm56ZXJvIiwgIm1lYW5fY3ZtIiwgIm1lZGlhbl9jdm0iKSkgJT4lCiAgZ2dwbG90Mjo6Z2dwbG90KC4pICsKICBnZ3Bsb3QyOjp0aGVtZV9idygpICsKICBnZ3Bsb3QyOjphZXMoeCA9IG56ZXJvKSArCiAgZ2dwbG90Mjo6Z2VvbV9wb2ludChtYXBwaW5nID0gZ2dwbG90Mjo6YWVzKHkgPSB2YXJpYWJsZSwgc2l6ZSA9IHZhbHVlLCBhbHBoYSA9IHZhbHVlLCBjb2xvciA9IHZhbHVlKjEwMCkpICsKICBnZ3Bsb3QyOjpzY2FsZV9jb2xvcl9ncmFkaWVudDIoaGlnaCA9ICdncmVlbicsIG1pZCA9ICJwdXJwbGUiLCBsb3cgPSAiYmxhY2siLCBtaWRwb2ludCA9NTApKwogIGdncGxvdDI6OnNjYWxlX2FscGhhKGd1aWRlID0gJ25vbmUnKSsKICBnZ3Bsb3QyOjpzY2FsZV9zaXplKGd1aWRlID0gJ25vbmUnKSsKICBnZ3Bsb3QyOjpzY2FsZV95X2Rpc2NyZXRlKGxhYmVscz0gYygiY2hpbGQgc2V4IiwiYmlydGggd2VpZ2h0IiwgImJpcnRoIGxlbmd0aCIsICJoZWFkIGNpcmN1bWZlcmVuY2UiLCAiZGVsaXZlcnkgbW9kZSIsICJpbmR1Y2VkIGxhYm9yIiwgInBhcml0eSIsICJtYXRlcm5hbCBhZ2UiLCAibWF0ZXJuYWwgQk1JIiwgIm1hdGVybmFsIGh5cGVydGVuc2lvbiIsICJtYXRlcm5hbCBkaWFiZXRlcyIsICJtYXRlcm5hbCBtZW50YWwgZGlzb3JkZXJzIiwgIm1hdGVybmFsIHNtb2tpbmciLCAibWF0ZXJuYWwgYWxjb2hvbCB1c2UiKSkrCiAgZ2dwbG90Mjo6c2NhbGVfeF9jb250aW51b3VzKGJyZWFrcz0wOjE0LCBsYWJlbHM9KSsKICBnZ3Bsb3QyOjpsYWJzKHk9InByZWRpY3RvciIsIHggPSAibnVtYmVyIG9mIG5vbi16ZXJvIGNvZWZmaWNpZW50cyIsIGNvbG9yPSIlIikrCiAgZ2dwbG90Mjo6dGhlbWUodGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTUpLCBheGlzLnRpdGxlLng9IGVsZW1lbnRfdGV4dChzaXplPTE1KSwgYXhpcy50aXRsZS55PSBlbGVtZW50X3RleHQoc2l6ZT0xNSkpCgpnMl9QbGFjZW50YV9QUkVET193YSA8LQogIGNzdW1tYXJ5X1BsYWNlbnRhX1BSRURPX3dhICU+JQogIGdncGxvdDI6OmdncGxvdCguKSArCiAgZ2dwbG90Mjo6dGhlbWVfYncoKSArCiAgZ2dwbG90Mjo6YWVzKHggPSBuemVybywgeSA9IG1lZGlhbl9jdm0pICsKICBnZ3Bsb3QyOjpnZW9tX3BvaW50KCkgKyBnZ3Bsb3QyOjpnZW9tX2xpbmUoKSsKICBnZ3Bsb3QyOjpsYWJzKHk9Im1lZGlhbiBjdm0iLCB4ID0gIm51bWJlciBvZiBub24temVybyBjb2VmZmljaWVudHMiKSsKICBnZ3Bsb3QyOjpzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzPTA6MTQsIGxhYmVscz0pKwogIGdncGxvdDI6OnRoZW1lKGF4aXMudGV4dD1lbGVtZW50X3RleHQoc2l6ZT0xNSksYXhpcy50aXRsZT1lbGVtZW50X3RleHQoc2l6ZT0xOCkpCgpncmlkRXh0cmE6OmdyaWQuYXJyYW5nZShnMV9QbGFjZW50YV9QUkVET193YSwgZzJfUGxhY2VudGFfUFJFRE9fd2EsIG5jb2wgPSAxKQoKYGBgCgoKYGBge3J9CnBuZyhmaWxlbmFtZT0iUmVzdWx0cy9GaWd1cmVzL2VsYXN0aWNOZXRfc2luZ2xlVGlzc3Vlcy9PdXRjb21lX21haW4vYm9vdHN0cmFwTW9kZWxzX1BsYWNlbnRhX1BSRURPLnBuZyIsIHdpZHRoPTI0MDAsIGhlaWdodD0xODAwLCByZXM9MzAwKQpncmlkRXh0cmE6OmdyaWQuYXJyYW5nZShnMV9QbGFjZW50YV9QUkVET193YSwgZzJfUGxhY2VudGFfUFJFRE9fd2EsIG5jb2wgPSAxKQpkZXYub2ZmKCkKYGBgCmBgYHtyfQpwbmcoZmlsZW5hbWU9IlJlc3VsdHMvRmlndXJlcy9lbGFzdGljTmV0X3NpbmdsZVRpc3N1ZXMvT3V0Y29tZV9tYWluL01vZGVsX1BsYWNlbmFfUFJFRE8ucG5nIiwgd2lkdGg9MjgwMCwgaGVpZ2h0PTE0MDAsIHJlcz00MDApCmcxX1BsYWNlbnRhX1BSRURPX3dhCmRldi5vZmYoKQpgYGAKCgpgYGB7cn0KZWxib3dfZmluZGVyKGNzdW1tYXJ5X1BsYWNlbnRhX1BSRURPX3dhJG56ZXJvLCBjc3VtbWFyeV9QbGFjZW50YV9QUkVET193YSRtZWRpYW5fY3ZtKQoKbnplcm9faW5kaWNlc19QbGFjZW50YV9QUkVET193YTwtIGRhdGEuZnJhbWUodChlbGJvd19maW5kZXIoY3N1bW1hcnlfUGxhY2VudGFfUFJFRE9fd2Ekbnplcm8sIGNzdW1tYXJ5X1BsYWNlbnRhX1BSRURPX3dhJG1lZGlhbl9jdm0pKSkKY29sbmFtZXMobnplcm9faW5kaWNlc19QbGFjZW50YV9QUkVET193YSkgPC0gYygieCIsICJ5IikKcm93bmFtZXMobnplcm9faW5kaWNlc19QbGFjZW50YV9QUkVET193YSkgPC0gTlVMTApgYGAKCmxvb2sgYXQgbW9kZWxzIHdpdGggNyBub24temVybyBjb2VmZmljaWVudC4KCmBgYHtyfQpuemVyb19maW5hbF9wbGFjZW50YV9wcmVkb193YSA8LSA5CmBgYAoKYGBge3J9CmNzdW1tYXJ5X1BsYWNlbnRhX1BSRURPX3dhW256ZXJvICVpbiUgbnplcm9fZmluYWxfcGxhY2VudGFfcHJlZG9fd2FdCmBgYAoKYGBge3J9Cm5vbnplcm9fY2hvb3NlX1BsYWNlbnRhX1BSRURPX3dhIDwtIGdncGxvdDI6OmdncGxvdChjc3VtbWFyeV9QbGFjZW50YV9QUkVET193YSkgKwogIGdncGxvdDI6OnRoZW1lX2J3KCkrCiAgZ2dwbG90Mjo6YWVzKHggPSBuemVybywgeSA9IG1lZGlhbl9jdm0pICsKICBnZ3Bsb3QyOjpzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzPWMoMDoxNykpKwogIGdncGxvdDI6Omdlb21fcG9pbnQoKSArIGdncGxvdDI6Omdlb21fbGluZSgpKwogIGdncGxvdDI6Omdlb21fcG9pbnQoZGF0YT1uemVyb19pbmRpY2VzX1BsYWNlbnRhX1BSRURPX3dhLCBhZXMoeD14LCB5PXkpLCBjb2xvdXI9InJlZCIsIHNpemU9MikrCiAgZ2dwbG90Mjo6eWxhYigibWVkaWFuIG9mIG1pbmltdW0gY3Jvc3MtdmFsaWRhdGlvbiBlcnJvcnMgb3ZlciBib290c3RyYXBzIikrCiAgZ2dwbG90Mjo6eGxhYigibnVtYmVyIG9mIG5vbi16ZXJvIGNvZWZmaWNpZW50cyIpKwogIGdncGxvdDI6Omdlb21fc2VnbWVudChhZXMoeCA9IG56ZXJvWzFdLCB5ID0gbWVkaWFuX2N2bVsxXSwgeGVuZCA9IG56ZXJvWzE0XSwgeWVuZCA9IG1lZGlhbl9jdm1bMTRdLCBjb2xvdXIgPSAic2VnbWVudCIpLCBkYXRhID0gY3N1bW1hcnlfUGxhY2VudGFfUFJFRE9fd2EsIHNob3cubGVnZW5kID0gRikKCm5vbnplcm9fY2hvb3NlX1BsYWNlbnRhX1BSRURPX3dhCmBgYAoKYGBge3J9CnBuZyhmaWxlbmFtZT0iUmVzdWx0cy9GaWd1cmVzL2VsYXN0aWNOZXRfc2luZ2xlVGlzc3Vlcy9PdXRjb21lX21haW4vbnplcm9fY2hvb3NlX1BsYWNlbnRhX1BSRURPLnBuZyIsIHdpZHRoPTE2MDAsIGhlaWdodD0xNDAwLCByZXM9MzAwKQpub256ZXJvX2Nob29zZV9QbGFjZW50YV9QUkVET193YQpkZXYub2ZmKCkKYGBgCgoKYGBge3J9CnN1bW1hcnlfUGxhY2VudGFfUFJFRE9fd2FfZmluYWxuemVybyA8LSBjc3VtbWFyeV9QbGFjZW50YV9QUkVET193YVtuemVybyAlaW4lIG56ZXJvX2ZpbmFsX3BsYWNlbnRhX3ByZWRvX3dhXQpzaWdfdmFyX25hbWVzX1BsYWNlbnRhX1BSRURPX3dhX2ZpbmFsbnplcm8gPC0gRmlsdGVyKGZ1bmN0aW9uKHgpIGFueSh4ID4gMC43NSksIHN1bW1hcnlfUGxhY2VudGFfUFJFRE9fd2FfZmluYWxuemVyb1ssIWMoIm56ZXJvIiwgIm1lYW5fY3ZtIiwgIm1lZGlhbl9jdm0iKV0pICU+JSBjb2xuYW1lcygpCmNvbG5hbWVzKHN1bW1hcnlfUGxhY2VudGFfUFJFRE9fd2FfZmluYWxuemVybykgPC0gYygibm9uLXplcm8iLCAiY2hpbGQgc2V4IiwgImJpcnRoIHdlaWdodCIsICJiaXJ0aCBsZW5ndGgiLCAiaGVhZCBjaXJjdW1mZXJlbmNlIiwgImRlbGl2ZXJ5IG1vZGUgKGFpZGVkKSIsICJpbmR1Y2VkIGxhYm9yICh5ZXMpIiwgInBhcml0eSAoYmlydGggYmVmb3JlKSIsICJtYXRlcm5hbCBhZ2UiLCAibWF0ZXJuYWwgQk1JIiwgIm1hdGVybmFsIGh5cGVydGVuc2lvbiAoeWVzKSIsICJtYXRlcm5hbCBkaWFiZXRlcyAoeWVzKSIsICJtYXRlcm5hbCBtZW50YWwgZGlzb3JkZXJzICh5ZXMpIiwgIm1hdGVybmFsIHNtb2tpbmcgKHllcykiLCAibWF0ZXJuYWwgXGFsY29ob2wgdXNlICh5ZXMpIiwgIm1lYW4gY3ZtIiwgIm1lZGlhbiBjdm0iKQpzdW1tYXJ5X1BsYWNlbnRhX1BSRURPX3dhX2ZpbmFsbnplcm9UIDwtIGFzLmRhdGEuZnJhbWUodChzdW1tYXJ5X1BsYWNlbnRhX1BSRURPX3dhX2ZpbmFsbnplcm9bLC1jKCJub24temVybyIsICJtZWRpYW4gY3ZtIiwgIm1lYW4gY3ZtIildKSkKc3VtbWFyeV9QbGFjZW50YV9QUkVET193YV9maW5hbG56ZXJvVCR2YXJpYWJsZSA8LSByb3duYW1lcyhzdW1tYXJ5X1BsYWNlbnRhX1BSRURPX3dhX2ZpbmFsbnplcm9UKQpyb3duYW1lcyhzdW1tYXJ5X1BsYWNlbnRhX1BSRURPX3dhX2ZpbmFsbnplcm9UKSA8LSBOVUxMCm5hbWVzKHN1bW1hcnlfUGxhY2VudGFfUFJFRE9fd2FfZmluYWxuemVyb1QpW25hbWVzKHN1bW1hcnlfUGxhY2VudGFfUFJFRE9fd2FfZmluYWxuemVyb1QpID09ICdWMSddIDwtICdwZXJjZW50JwpzdW1tYXJ5X1BsYWNlbnRhX1BSRURPX3dhX2ZpbmFsbnplcm9UIDwtIHN1bW1hcnlfUGxhY2VudGFfUFJFRE9fd2FfZmluYWxuemVyb1Rbb3JkZXIoc3VtbWFyeV9QbGFjZW50YV9QUkVET193YV9maW5hbG56ZXJvVCRwZXJjZW50KSxdCgpzdW1tYXJ5X1BsYWNlbnRhX1BSRURPX3dhX2ZpbmFsbnplcm9UJG51bWJlciA8LSBzZXEoMSwgbGVuZ3RoKHN1bW1hcnlfUGxhY2VudGFfUFJFRE9fd2FfZmluYWxuemVyb1QkdmFyaWFibGUpKQpgYGAKCmBgYHtyLCBmaWcud2lkdGg9OH0KcGVyY192YXJzX1BsYWNlbnRhX1BSRURPX3dhIDwtIAogIGdncGxvdChzdW1tYXJ5X1BsYWNlbnRhX1BSRURPX3dhX2ZpbmFsbnplcm9ULCBhZXMocmVvcmRlcih2YXJpYWJsZSwgcGVyY2VudCksIHBlcmNlbnQsIGdyb3VwPTEpKSsKICBnZW9tX3BvaW50KCkrIGdlb21fbGluZSgpKwogIHlsYWIoIiUgb2NjdXJlbmNlIGluIG1vZGVscyB3aXRoIG56ZXJvIGNvZWZmaWNpZW50cyA9IDgiKSsKICBzY2FsZV95X2NvbnRpbnVvdXMoYnJlYWtzPWMoMC4xLDAuMiwwLjMsMC40LDAuNSwwLjYsMC43LDAuOCwwLjkpKSsKICB4bGFiKCJ2YXJpYWJsZSIpKwogIGNvb3JkX2ZsaXAoKSsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQ9MC43NSwgbGluZXR5cGU9ImRvdHRlZCIpKwogIHRoZW1lX2J3KCkKCnBlcmNfdmFyc19QbGFjZW50YV9QUkVET193YQoKIyBkZWNpZGUgZm9yIGN1dC1vZmYgJSAtPiBoZXJlIC43NQoKRmlsdGVyKGZ1bmN0aW9uKHgpIGFueSh4ID4gMC43NSksIHN1bW1hcnlfUGxhY2VudGFfUFJFRE9fd2FfZmluYWxuemVyb1ssIWMoIm5vbi16ZXJvIiwgIm1lYW4gY3ZtIiwgIm1lZGlhbiBjdm0iKV0pCgpgYGAKCgpgYGB7cn0KcG5nKGZpbGVuYW1lPSJSZXN1bHRzL0ZpZ3VyZXMvZWxhc3RpY05ldF9zaW5nbGVUaXNzdWVzL091dGNvbWVfbWFpbi92YXJzUGVyY2VudF9QbGFjZW50YV9QUkVETy5wbmciLCB3aWR0aD0xMTAwLCBoZWlnaHQ9MTQwMCwgcmVzPTMwMCkKcGVyY192YXJzX1BsYWNlbnRhX1BSRURPX3dhCmRldi5vZmYoKQpgYGAKCiAgCmBgYHtyfQpwbTJfUGxhY2VudGFfUFJFRE9fd2FfY29lZiA8LQogIGRjYXN0KHBtMl9QbGFjZW50YV9QUkVET193YVssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXMubGlzdCh1bmxpc3QoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBwbHkoLlNELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uKHgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHkgPC0gdW5uYW1lKHF1YW50aWxlKHhbeCAhPSAwXSwgcHJvYnMgPSBjKDAuMDI1LCAwLjk3NSkpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdCgibm9uX3plcm8iID0gMTAwICogbWVhbih4ICE9IDApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsY2wgPSB5WzFdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1Y2wgPSB5WzJdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aCA9IGRpZmYoeSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhbiA9IG1lZGlhbih4W3ghPSAwXSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuU0Rjb2xzID0gYygiQ2hpbGRfU2V4ZmVtYWxlIiwgIkJpcnRoX1dlaWdodCIsICJCaXJ0aF9MZW5ndGgiLCAiSGVhZF9DaXJjdW1mZXJlbmNlX2F0X0JpcnRoIiwgIkRlbGl2ZXJ5X01vZGVfZGljaG90b21haWRlZCIsICJpbmR1Y2VkbGFib3VyWWVzIiwgIlBhcml0eV9kaWNob3RvbWdpdmVuIGJpcnRoIGJlZm9yZSIsICJNYXRlcm5hbF9BZ2VfMThQb3BSZWdhbmRCUiIsICJNYXRlcm5hbF9QcmVwcmVnbmFuY3lCTUkxOG9jdDI4bmV3IiwgIm1hdGVybmFsX2h5cGVydGVuc2lvbl9kaWNob3RvbWh5cGVydGVuc2lvbiBpbiBjdXJyZW50IHByZWduYW5jeSIsIm1hdGVybmFsX2RpYWJldGVzX2RpY2hvdG9tZGlhYmV0ZXMgaW4gY3VycmVudCBwcmVnbmFuY3kiLCJNYXRlcm5hbF9NZW50YWxfRGlzb3JkZXJzX0J5X0NoaWxkYmlydGhZZXMiLCJzbW9raW5nX2RpY2hvdG9teWVzIiwiQWxjb2hvbF9Vc2VfSW5fRWFybHlfUHJlZ25hbmN5XzE5T2N0eWVzIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnkgPSBuemVyb11bb3JkZXIobnplcm8pXSAlPiUKICAgICAgICAgIG1lbHQoaWQudmFyID0gIm56ZXJvIikgJT4lCiAgICAgICAgICAuWywgbWV0cmljIDo9IHN1YigiXi4rXFwuKC4rKSQiLCAiXFwxIiwgdmFyaWFibGUpXSAlPiUKICAgICAgICAgIC5bLCB2YXJpYWJsZSA6PSBzdWIoIl4oLispXFwuLiskIiwgIlxcMSIsIHZhcmlhYmxlKV0gJT4lCiAgICAgICAgICAuW256ZXJvID09IG56ZXJvX2ZpbmFsX3BsYWNlbnRhX3ByZWRvX3dhXSwgbnplcm8rIHZhcmlhYmxlIH4gbWV0cmljLCB2YWx1ZS52YXI9InZhbHVlIikKCiMgZ2V0IGRlc2lyZWQgb3JkZXIgb2YgcHJlZGljdG9ycwpwbTJfUGxhY2VudGFfUFJFRE9fd2FfY29lZiA8LQogIHBtMl9QbGFjZW50YV9QUkVET193YV9jb2VmW21hdGNoKGMoIkNoaWxkX1NleGZlbWFsZSIsICJCaXJ0aF9XZWlnaHQiLCAiQmlydGhfTGVuZ3RoIiwgIkhlYWRfQ2lyY3VtZmVyZW5jZV9hdF9CaXJ0aCIsICJEZWxpdmVyeV9Nb2RlX2RpY2hvdG9tYWlkZWQiLCAiaW5kdWNlZGxhYm91clllcyIsICJQYXJpdHlfZGljaG90b21naXZlbiBiaXJ0aCBiZWZvcmUiLCAiTWF0ZXJuYWxfQWdlXzE4UG9wUmVnYW5kQlIiLCAiTWF0ZXJuYWxfUHJlcHJlZ25hbmN5Qk1JMThvY3QyOG5ldyIsICJtYXRlcm5hbF9oeXBlcnRlbnNpb25fZGljaG90b21oeXBlcnRlbnNpb24gaW4gY3VycmVudCBwcmVnbmFuY3kiLCJtYXRlcm5hbF9kaWFiZXRlc19kaWNob3RvbWRpYWJldGVzIGluIGN1cnJlbnQgcHJlZ25hbmN5IiwiTWF0ZXJuYWxfTWVudGFsX0Rpc29yZGVyc19CeV9DaGlsZGJpcnRoWWVzIiwic21va2luZ19kaWNob3RvbXllcyIsIkFsY29ob2xfVXNlX0luX0Vhcmx5X1ByZWduYW5jeV8xOU9jdHllcyIpLCBwbTJfUGxhY2VudGFfUFJFRE9fd2FfY29lZiR2YXJpYWJsZSksXQpwbTJfUGxhY2VudGFfUFJFRE9fd2FfY29lZiR2YXJpYWJsZSA8LSBmYWN0b3IocG0yX1BsYWNlbnRhX1BSRURPX3dhX2NvZWYkdmFyaWFibCwgbGV2ZWxzPXVuaXF1ZShwbTJfUGxhY2VudGFfUFJFRE9fd2FfY29lZiR2YXJpYWJsZSkpCgojIyBOT1RFOiBtZWRpYW4gaXMgdXNlZCBoZXJlIGluc3RlYWQgb2YgbWVhbgojIG1ha2UgZnJhbWUgZm9yIG9ubHkgc2lnbmlmaWNhbnQgdmFyaWFibGVzOgpwbTJfUGxhY2VudGFfUFJFRE9fd2FfZGF0YWJsZSA8LSBkY2FzdChwbTJfUGxhY2VudGFfUFJFRE9fd2FbLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzLmxpc3QodW5saXN0KAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwcGx5KC5TRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbih4KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5IDwtIHVubmFtZShxdWFudGlsZSh4W3ggIT0gMF0sIHByb2JzID0gYygwLjAyNSwgMC45NzUpKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3QoIm5vbl96ZXJvIiA9IDEwMCAqIG1lYW4oeCAhPSAwKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGNsID0geVsxXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWNsID0geVsyXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGggPSBkaWZmKHkpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYW4gPSBtZWRpYW4oeFt4IT0gMF0pKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLlNEY29scyA9IGMoIkNoaWxkX1NleGZlbWFsZSIsICJCaXJ0aF9XZWlnaHQiLCAiQmlydGhfTGVuZ3RoIiwgIkhlYWRfQ2lyY3VtZmVyZW5jZV9hdF9CaXJ0aCIsICJEZWxpdmVyeV9Nb2RlX2RpY2hvdG9tYWlkZWQiLCAiaW5kdWNlZGxhYm91clllcyIsICJQYXJpdHlfZGljaG90b21naXZlbiBiaXJ0aCBiZWZvcmUiLCAiTWF0ZXJuYWxfQWdlXzE4UG9wUmVnYW5kQlIiLCAiTWF0ZXJuYWxfUHJlcHJlZ25hbmN5Qk1JMThvY3QyOG5ldyIsICJtYXRlcm5hbF9oeXBlcnRlbnNpb25fZGljaG90b21oeXBlcnRlbnNpb24gaW4gY3VycmVudCBwcmVnbmFuY3kiLCJtYXRlcm5hbF9kaWFiZXRlc19kaWNob3RvbWRpYWJldGVzIGluIGN1cnJlbnQgcHJlZ25hbmN5IiwiTWF0ZXJuYWxfTWVudGFsX0Rpc29yZGVyc19CeV9DaGlsZGJpcnRoWWVzIiwic21va2luZ19kaWNob3RvbXllcyIsIkFsY29ob2xfVXNlX0luX0Vhcmx5X1ByZWduYW5jeV8xOU9jdHllcyIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5ID0gbnplcm9dW29yZGVyKG56ZXJvKV0gJT4lCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZWx0KGlkLnZhciA9ICJuemVybyIpICU+JQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLlssIG1ldHJpYyA6PSBzdWIoIl4uK1xcLiguKykkIiwgIlxcMSIsIHZhcmlhYmxlKV0gJT4lCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuWywgdmFyaWFibGUgOj0gc3ViKCJeKC4rKVxcLi4rJCIsICJcXDEiLCB2YXJpYWJsZSldICU+JQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBwcmludCAlPiUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5bbnplcm8gPT0gbnplcm9fZmluYWxfcGxhY2VudGFfcHJlZG9fd2EmIHZhcmlhYmxlICVpbiUgc2lnX3Zhcl9uYW1lc19QbGFjZW50YV9QUkVET193YV9maW5hbG56ZXJvXSwgbnplcm8rIHZhcmlhYmxlIH4gbWV0cmljLCB2YWx1ZS52YXI9InZhbHVlIikKCmBgYAoKCmBgYHtyfQpzaWdfdmFyc19QbGFjZW50YV9QUkVET193YSA8LQogIHBtMl9QbGFjZW50YV9QUkVET193YV9jb2VmICU+JQogIGdncGxvdDI6OmdncGxvdCguKSArCiAgZ2dwbG90Mjo6dGhlbWVfYncoKSArCiAgZ2dwbG90Mjo6dGhlbWUoYXhpcy50ZXh0Lng9ZWxlbWVudF9ibGFuaygpKSsKICBnZ3Bsb3QyOjphZXMoeD0ibnplcm8iKSsKICBnZ3Bsb3QyOjpnZW9tX3BvaW50KG1hcHBpbmcgPSBnZ3Bsb3QyOjphZXMoeSA9IHZhcmlhYmxlLCBzaXplID1ub25femVybywgYWxwaGEgPSBub25femVybywgY29sb3IgPSBub25femVybykpICsKICBnZ3Bsb3QyOjpnZW9tX3RleHQoYWVzKHk9dmFyaWFibGUsIGxhYmVsPXNwcmludGYoIiUwLjJmIiwgcm91bmQobWVkaWFuLCBkaWdpdHM9MikpLCBzaXplPTUwKSxoanVzdD0wLCB2anVzdD0wLjUsIG51ZGdlX3ggPSAwLjEpKwogIGdncGxvdDI6OnNjYWxlX2NvbG9yX2dyYWRpZW50MihoaWdoID0gJ2dyZWVuJywgbWlkID0gInB1cnBsZSIsIGxvdyA9ICJibGFjayIsIG1pZHBvaW50ID01MCkrCiAgZ2dwbG90Mjo6c2NhbGVfYWxwaGEoZ3VpZGUgPSAnbm9uZScpKwogIGdncGxvdDI6OnNjYWxlX3NpemUoZ3VpZGUgPSAnbm9uZScpKwogIGdncGxvdDI6OnNjYWxlX3lfZGlzY3JldGUobGFiZWxzPSBjKCJjaGlsZCBzZXgiLCAiYmlydGggd2VpZ2h0IiwgImJpcnRoIGxlbmd0aCIsICJoZWFkIGNpcmN1bWZlcmVuY2UiLCAiZGVsaXZlcnkgbW9kZSAoYWlkZWQpIiwgImluZHVjZWQgbGFib3IgKHllcykiLCAicGFyaXR5IChiaXJ0aCBiZWZvcmUpIiwgIm1hdGVybmFsIGFnZSIsICJtYXRlcm5hbCBCTUkiLCAibWF0ZXJuYWwgaHlwZXJ0ZW5zaW9uICh5ZXMpIiwgIm1hdGVybmFsIGRpYWJldGVzICh5ZXMpIiwgIm1hdGVybmFsIG1lbnRhbCBkaXNvcmRlcnMgKHllcykiLCAibWF0ZXJuYWwgc21va2luZyAoeWVzKSIsICJtYXRlcm5hbCBhbGNvaG9sIHVzZSAoeWVzKSIpKSsKICBnZ3Bsb3QyOjpsYWJzKHk9InByZWRpY3RvciIsIHggPSAibnVtYmVyIG9mIG5vbi16ZXJvIGNvZWZmaWNpZW50cyA9IDkiLCBjb2xvcj0iJSIpCgoKYGBgCgpgYGB7cn0KY29lZl9QbGFjZW50YV9QUkVET193YSA8LSAKICBnZ3Bsb3QocG0yX1BsYWNlbnRhX1BSRURPX3dhX2NvZWYsIGFlcyh5ID0gdmFyaWFibGUsIHg9bWVkaWFuKSkrCiAgZ2VvbV9wb2ludChtYXBwaW5nID0gZ2dwbG90Mjo6YWVzKHkgPSB2YXJpYWJsZSwgc2l6ZSA9bm9uX3plcm8sIGFscGhhID0gbm9uX3plcm8sIGNvbG9yID0gbm9uX3plcm8pKSsKICBzY2FsZV9jb2xvcl9ncmFkaWVudDIoaGlnaCA9ICdncmVlbicsIG1pZCA9ICJwdXJwbGUiLCBsb3cgPSAiYmxhY2siLCBtaWRwb2ludCA9NTAsIGxpbWl0cz1jKDAsMTAwKSkrCiAgc2NhbGVfYWxwaGEoZ3VpZGUgPSAnbm9uZScpKwogIHNjYWxlX3NpemUoZ3VpZGUgPSAnbm9uZScpKwogIGdlb21fcG9pbnQoKSsKICBnZW9tX2Vycm9yYmFyKGFlcyh5ID0gdmFyaWFibGUsIHhtaW4gPSBsY2wsIHhtYXggPSB1Y2wpLCB3aWR0aCA9IDAuMikrCiAgbGFicyh5PSJwcmVkaWN0b3IiLCB4ID0gIlxubWVkaWFuICYgOTUlIENJIG9mIGNvZWZmaWNpZW50IChvdmVyIGJvb3RzdHJhcHMpIiwgY29sb3I9IiUiKSsKICBzY2FsZV94X2NvbnRpbnVvdXMobGltaXRzPWMoLTAuNSwwLjQpLCBicmVha3M9YygtLjQsLS4zLC0uMiwgLS4xLCAwLCAuMSwgLjIsIC4zLCAuNCkpKwogIHNjYWxlX3lfZGlzY3JldGUobGFiZWxzPSBjKCJjaGlsZCBzZXggKGZlbWFsZSkiLCAiYmlydGggd2VpZ2h0IiwgImJpcnRoIGxlbmd0aCIsICJoZWFkIGNpcmN1bWZlcmVuY2UiLCAiZGVsaXZlcnkgbW9kZSAoYWlkZWQpIiwgImluZHVjZWQgbGFib3IgKHllcykiLCAicGFyaXR5IChiaXJ0aCBiZWZvcmUpIiwgIm1hdGVybmFsIGFnZSIsICJtYXRlcm5hbCBCTUkiLCAibWF0ZXJuYWwgaHlwZXJ0ZW5zaW9uICh5ZXMpIiwgIm1hdGVybmFsIGRpYWJldGVzICh5ZXMpIiwgIm1hdGVybmFsIG1lbnRhbCBkaXNvcmRlcnMgKHllcykiLCAibWF0ZXJuYWwgc21va2luZyAoeWVzKSIsICJtYXRlcm5hbCBhbGNvaG9sIHVzZSAoeWVzKSIpKSsKICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQ9MCwgbGluZXR5cGU9ImRhc2hlZCIpKwogIHRoZW1lX2J3KCkrCiAgdGhlbWUodGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTUpLCBheGlzLnRpdGxlLng9IGVsZW1lbnRfdGV4dChzaXplPTE1KSwgYXhpcy50aXRsZS55PSBlbGVtZW50X3RleHQoc2l6ZT0xNSkpCgoKY29lZl9QbGFjZW50YV9QUkVET193YQpgYGAKCgpgYGB7cn0KcG5nKGZpbGVuYW1lPSJSZXN1bHRzL0ZpZ3VyZXMvZWxhc3RpY05ldF9zaW5nbGVUaXNzdWVzL091dGNvbWVfbWFpbi9jb2VmX1BsYWNlbnRhX1BSRURPLnBuZyIsIHdpZHRoPTI4MDAsIGhlaWdodD0xNDAwLCByZXM9NDAwKQpjb2VmX1BsYWNlbnRhX1BSRURPX3dhCmRldi5vZmYoKQpgYGAKCmBgYHtyfQpwMSA8LQogIGNzdW1tYXJ5X1BsYWNlbnRhX1BSRURPX3dhICU+JQogIG1lbHQoaWQudmFycyA9IGMoIm56ZXJvIiwgIm1lYW5fY3ZtIiwgIm1lZGlhbl9jdm0iKSkgJT4lCiAgZ2dwbG90Mjo6Z2dwbG90KC4pICsKICBnZ3Bsb3QyOjp0aGVtZV9idygpICsKICBnZ3Bsb3QyOjphZXMoeCA9IG56ZXJvKSArCiAgZ2dwbG90Mjo6Z2VvbV9wb2ludChtYXBwaW5nID0gZ2dwbG90Mjo6YWVzKHkgPSB2YXJpYWJsZSwgc2l6ZSA9IHZhbHVlLCBhbHBoYSA9IHZhbHVlLCBjb2xvciA9IHZhbHVlKjEwMCkpICsKICBnZ3Bsb3QyOjpzY2FsZV9jb2xvcl9ncmFkaWVudDIoaGlnaCA9ICdncmVlbicsIG1pZCA9ICJwdXJwbGUiLCBsb3cgPSAiYmxhY2siLCBtaWRwb2ludCA9NTApKwogIGdncGxvdDI6OnNjYWxlX2FscGhhKGd1aWRlID0gJ25vbmUnKSsKICBnZ3Bsb3QyOjpzY2FsZV9zaXplKGd1aWRlID0gJ25vbmUnKSsKICBnZ3Bsb3QyOjpzY2FsZV95X2Rpc2NyZXRlKGxhYmVscz0gYygiY2hpbGQgc2V4IChmZW1hbGUpIiwgImJpcnRoIHdlaWdodCIsICJiaXJ0aCBsZW5ndGgiLCAiaGVhZCBjaXJjdW1mZXJlbmNlIiwgImRlbGl2ZXJ5IG1vZGUgKGFpZGVkKSIsICJpbmR1Y2VkIGxhYm9yICh5ZXMpIiwgInBhcml0eSAoYmlydGggYmVmb3JlKSIsICJtYXRlcm5hbCBhZ2UiLCAibWF0ZXJuYWwgQk1JIiwgIm1hdGVybmFsIGh5cGVydGVuc2lvbiAoeWVzKSIsICJtYXRlcm5hbCBkaWFiZXRlcyAoeWVzKSIsICJtYXRlcm5hbCBtZW50YWwgZGlzb3JkZXJzICh5ZXMpIiwgIm1hdGVybmFsIHNtb2tpbmcgKHllcykiLCAibWF0ZXJuYWwgYWxjb2hvbCB1c2UgKHllcykiKSkrCiAgZ2dwbG90Mjo6c2NhbGVfeF9jb250aW51b3VzKGJyZWFrcz0wOjE0LCBsYWJlbHM9KSsKICBnZ3Bsb3QyOjpsYWJzKHk9InByZWRpY3RvciIsIHggPSAiXG5udW1iZXIgb2Ygbm9uLXplcm8gY29lZmZpY2llbnRzIiwgY29sb3I9IiUiKSsKICBnZ3Bsb3QyOjp0aGVtZSh0ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNyksIGF4aXMudGl0bGUueD0gZWxlbWVudF90ZXh0KHNpemU9MTUpLCBheGlzLnRpdGxlLnk9IGVsZW1lbnRfdGV4dChzaXplPTE1KSwgbGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKQogIApwMiA8LSAKY29lZl9QbGFjZW50YV9QUkVET193YSA8LSAKICBnZ3Bsb3QocG0yX1BsYWNlbnRhX1BSRURPX3dhX2NvZWYsIGFlcyh5ID0gdmFyaWFibGUsIHg9bWVkaWFuKSkrCiAgZ2VvbV9wb2ludChtYXBwaW5nID0gZ2dwbG90Mjo6YWVzKHkgPSB2YXJpYWJsZSwgc2l6ZSA9bm9uX3plcm8sIGFscGhhID0gbm9uX3plcm8sIGNvbG9yID0gbm9uX3plcm8pKSsKICBzY2FsZV9jb2xvcl9ncmFkaWVudDIoaGlnaCA9ICdncmVlbicsIG1pZCA9ICJwdXJwbGUiLCBsb3cgPSAiYmxhY2siLCBtaWRwb2ludCA9NTAsIGxpbWl0cz1jKDAsMTAwKSkrCiAgc2NhbGVfYWxwaGEoZ3VpZGUgPSAnbm9uZScpKwogIHNjYWxlX3NpemUoZ3VpZGUgPSAnbm9uZScpKwogIGdlb21fcG9pbnQoKSsKICBnZW9tX2Vycm9yYmFyKGFlcyh5ID0gdmFyaWFibGUsIHhtaW4gPSBsY2wsIHhtYXggPSB1Y2wpLCB3aWR0aCA9IDAuMikrCiAgbGFicyh5PSIiLCB4ID0gIlxubWVkaWFuICYgOTUlIENJIG9mIGNvZWZmaWNpZW50IChvdmVyIGJvb3RzdHJhcHMpIiwgY29sb3I9IiUiKSsKICBzY2FsZV94X2NvbnRpbnVvdXMobGltaXRzPWMoLTAuNSwwLjQpLCBicmVha3M9YygtLjQsLS4zLC0uMiwgLS4xLCAwLCAuMSwgLjIsIC4zLCAuNCkpKwogIHNjYWxlX3lfZGlzY3JldGUobGFiZWxzPSBjKCJjaGlsZCBzZXggKGZlbWFsZSkiLCAiYmlydGggd2VpZ2h0IiwgImJpcnRoIGxlbmd0aCIsICJoZWFkIGNpcmN1bWZlcmVuY2UiLCAiZGVsaXZlcnkgbW9kZSAoYWlkZWQpIiwgImluZHVjZWQgbGFib3IgKHllcykiLCAicGFyaXR5IChiaXJ0aCBiZWZvcmUpIiwgIm1hdGVybmFsIGFnZSIsICJtYXRlcm5hbCBCTUkiLCAibWF0ZXJuYWwgaHlwZXJ0ZW5zaW9uICh5ZXMpIiwgIm1hdGVybmFsIGRpYWJldGVzICh5ZXMpIiwgIm1hdGVybmFsIG1lbnRhbCBkaXNvcmRlcnMgKHllcykiLCAibWF0ZXJuYWwgc21va2luZyAoeWVzKSIsICJtYXRlcm5hbCBhbGNvaG9sIHVzZSAoeWVzKSIpKSsKICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQ9MCwgbGluZXR5cGU9ImRhc2hlZCIpKwogIHRoZW1lX2J3KCkrCiAgZ2d0aXRsZSgibnplcm8gPSA5IikrCiAgdGhlbWUodGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTcpLCBheGlzLnRpdGxlLng9IGVsZW1lbnRfdGV4dChzaXplPTE1KSwgYXhpcy50aXRsZS55PSBlbGVtZW50X3RleHQoc2l6ZT0xNSksIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZT0xNSksIGF4aXMudGV4dC55PWVsZW1lbnRfYmxhbmsoKSkKCmcxIDwtIGdncGxvdEdyb2IocDEpCmcyIDwtIGdncGxvdEdyb2IocDIpCmcgPC0gY2JpbmQoZzEsIGcyLCBzaXplID0gImxhc3QiKQpnJGhlaWdodHMgPC0gdW5pdC5wbWF4KGcxJGhlaWdodHMsIGcyJGhlaWdodHMpCgpwbmcoZmlsZW5hbWU9IlJlc3VsdHMvRmlndXJlcy9lbGFzdGljTmV0X3NpbmdsZVRpc3N1ZXMvT3V0Y29tZV9tYWluL01vZGVsX2NvZWZfUGxhY2VudGFfUFJFRE8ucG5nIiwgd2lkdGg9NTgwMCwgaGVpZ2h0PTE2MDAsIHJlcz00MDApCmdyaWQuZHJhdyhnKQpkZXYub2ZmKCkKYGBgCgpbdG8gdGhlIHRvcF0oI3RvcCkKCiMjIFBsYWNlbnRhIGVsYXN0aWMgbmV0IHNwbGl0dGVkIGJ5IHNleCB7I2VsYXN0aWNuZXRQbGFjZW50YVBSRURPX3N9ICAKbW9kZWwgd2l0aG91dCBhbGNvaG9sIHZhcmlhYmxlLCBidXQgc3BsaXR0ZWQgYnkgc2V4CgojIyMgbWFsZXMKCmBgYHtyfQojIGluIGNhc2UgeW91IHdhbnQgdG8gc3RhcnQgZnJvbSBoZXJlCmxvYWQoIklucHV0RGF0YS9DbG9ja0NhbGN1bGF0aW9uc0lucHV0L1JlZ19JbnB1dF9EYXRhX1BsYWNlbnRhX21hbGVfUFJFRE9fRUFBUl9ub05hX24uUmRhdGEiKQpSZWdfSW5wdXRfRGF0YV9QbGFjZW50YV9tYWxlX1BSRURPX0VBQVJfbm9OYV9uJENoaWxkX1NleCA8LSBOVUxMCmBgYAoKCmBgYHtyfQp5cmNfbWF0X1BSRURPX1BsYWNlbnRhX21hbGVfbiA8LSBtYXRyaXgoUmVnX0lucHV0X0RhdGFfUGxhY2VudGFfbWFsZV9QUkVET19FQUFSX25vTmFfbiRFQUFSX0xlZSkKeHJjX21hdF9QUkVET19QbGFjZW50YV9tYWxlX24gPC0gbW9kZWwubWF0cml4KCB+IC4gLSBFQUFSX0xlZSwgZGF0YSA9IFJlZ19JbnB1dF9EYXRhX1BsYWNlbnRhX21hbGVfUFJFRE9fRUFBUl9ub05hX24pWywgLTFdCnlyY19tYXRfUFJFRE9fc2NhbGVkX1BsYWNlbnRhX21hbGVfbiA8LSBzY2FsZSh5cmNfbWF0X1BSRURPX1BsYWNlbnRhX21hbGVfbikKeHJjX21hdF9QUkVET19zY2FsZWRfUGxhY2VudGFfbWFsZV9uIDwtIHNjYWxlKHhyY19tYXRfUFJFRE9fUGxhY2VudGFfbWFsZV9uKQpgYGAKCjwhLS0gc2V0IHNlZWQgLS0+CjwhLS0gYGBge3J9IC0tPgo8IS0tIHNldC5zZWVkKDIwMjApIC0tPgo8IS0tIGBgYCAtLT4KCgo8IS0tIGBgYHtyLCB3YXJuaW5nPUZ9IC0tPgo8IS0tICAgbmJvb3QgPSAxMDAwIC0tPgoKPCEtLSAgIGJvb3RzdHJhcHNfUGxhY2VudGFfbWFsZV9QUkVET19uIDwtIHJlcGxpY2F0ZShuYm9vdCwgeyAtLT4KPCEtLSAgICAgcndzIDwtIHNhbXBsZSgxOm5yb3coeHJjX21hdF9QUkVET19zY2FsZWRfUGxhY2VudGFfbWFsZV9uKSwgcmVwbGFjZSA9IFRSVUUpIC0tPgo8IS0tICAgICBlbnNyKHhyY19tYXRfUFJFRE9fc2NhbGVkX1BsYWNlbnRhX21hbGVfbltyd3MsIF0sIHlyY19tYXRfUFJFRE9fc2NhbGVkX1BsYWNlbnRhX21hbGVfbltyd3MsIF0sIHN0YW5kYXJkaXplZCA9IEZBTFNFLCBmYW1pbHk9ImdhdXNzaWFuIiwgbmxhbWJkYT0xMDAsIG5mb2xkcz0xMCwgYWxwaGE9YygwLjAsMC4xLDAuMiwwLjMsMC40LDAuNSwwLjYsMC43LDAuOCwwLjksMS4wKSkgLS0+CjwhLS0gICB9LCAtLT4KPCEtLSAgIHNpbXBsaWZ5ID0gRkFMU0UpIC0tPgo8IS0tIGBgYCAtLT4KCjwhLS0gYGBge3J9IC0tPgo8IS0tIHNhdmUoYm9vdHN0cmFwc19QbGFjZW50YV9tYWxlX1BSRURPX24sIGZpbGU9IklucHV0RGF0YS9EYXRhX0VsYXN0aWNOZXRzL2Jvb3RzdHJhcHNfUGxhY2VudGFfbWFsZV9QUkVET19uXzEwMDAuUmRhdGEiKSAtLT4KPCEtLSBgYGAgLS0+CgoKYGBge3J9CmxvYWQoIklucHV0RGF0YS9EYXRhX0VsYXN0aWNOZXRzL2Jvb3RzdHJhcHNfUGxhY2VudGFfbWFsZV9QUkVET19uXzEwMDAuUmRhdGEiKQpgYGAKCmBgYHtyfQpzdW1tYXJpZXNfUGxhY2VudGFfbWFsZV9QUkVET19uIDwtCiAgYm9vdHN0cmFwc19QbGFjZW50YV9tYWxlX1BSRURPX24gJT4lCiAgbGFwcGx5KHN1bW1hcnkpICU+JQogIHJiaW5kbGlzdChpZGNvbCA9ICJib290c3RyYXAiKQoKc3VtbWFyaWVzX1BsYWNlbnRhX21hbGVfUFJFRE9fbgpgYGAKCgpgYGB7cn0Kc3VtbWFyaWVzX1BsYWNlbnRhX21hbGVfUFJFRE9fblssIC5TRFtjdm0gPT0gbWluKGN2bSldLCBieSA9IGMoImJvb3RzdHJhcCIsICJuemVybyIpXSAlPiUKICBnZ3Bsb3QyOjpnZ3Bsb3QoZGF0YSA9IC4pICsKICBnZ3Bsb3QyOjphZXMoeCA9IG56ZXJvLCB5ID0gY3ZtLCBncm91cCA9IGJvb3RzdHJhcCkgKwogIGdncGxvdDI6Omdlb21fcG9pbnQoKSArCiAgZ2dwbG90Mjo6Z2VvbV9saW5lKCkKYGBgCgoKYGBge3J9CnBuZyhmaWxlbmFtZT0iUmVzdWx0cy9GaWd1cmVzL2VsYXN0aWNOZXRfc2luZ2xlVGlzc3Vlcy9PdXRjb21lX2FkZC9zZXhfc3BsaXQvYm9vdHN0cmFwc19QbGFjZW50YV9QUkVET19NQUxFLnBuZyIsIHdpZHRoPTgwMCwgaGVpZ2h0PTYwMCkKc3VtbWFyaWVzX1BsYWNlbnRhX21hbGVfUFJFRE9fblssIC5TRFtjdm0gPT0gbWluKGN2bSldLCBieSA9IGMoImJvb3RzdHJhcCIsICJuemVybyIpXSAlPiUKICBnZ3Bsb3QyOjpnZ3Bsb3QoZGF0YSA9IC4pICsKICBnZ3Bsb3QyOjphZXMoeCA9IG56ZXJvLCB5ID0gY3ZtLCBncm91cCA9IGJvb3RzdHJhcCkgKwogIGdncGxvdDI6Omdlb21fcG9pbnQoKSArCiAgZ2dwbG90Mjo6Z2VvbV9saW5lKCkKZGV2Lm9mZigpCmBgYAoKCjwhLS0gYGBge3IsIHdhcm5pbmc9RkFMU0V9IC0tPgo8IS0tICMgbG93ZXN0IGN2bSBieSBib290c3RyYXAgYW5kIG56ZXJvIC0tPgo8IS0tIHBtX1BsYWNlbnRhX21hbGVfUFJFRE9fbiA8LSBzdW1tYXJpZXNfUGxhY2VudGFfbWFsZV9QUkVET19uWywgLlNEW2N2bSA9PSBtaW4oY3ZtKV0sIGJ5ID0gYygiYm9vdHN0cmFwIiwgIm56ZXJvIildIC0tPgo8IS0tIHBtMl9QbGFjZW50YV9tYWxlX1BSRURPX24gPC0gTlVMTCAtLT4KCjwhLS0gZm9yKGkgaW4gYXMuaW50ZWdlcihzZXEoMSwgbnJvdyhwbV9QbGFjZW50YV9tYWxlX1BSRURPX24pLCBieSA9IDEpKSkgeyAtLT4KPCEtLSAgIHBtMl9QbGFjZW50YV9tYWxlX1BSRURPX24gPC0gcmJpbmQocG0yX1BsYWNlbnRhX21hbGVfUFJFRE9fbiwgLS0+CjwhLS0gICAgICAgICAgICAgICAgY2JpbmQocG1fUGxhY2VudGFfbWFsZV9QUkVET19uW2ksIF0sIC0tPgo8IS0tICAgICAgICAgICAgICAgIHQoYXMubWF0cml4KGNvZWYoYm9vdHN0cmFwc19QbGFjZW50YV9tYWxlX1BSRURPX25bW3BtX1BsYWNlbnRhX21hbGVfUFJFRE9fbltpLCBib290c3RyYXBdXV1bW3BtX1BsYWNlbnRhX21hbGVfUFJFRE9fbltpLCBsX2luZGV4XV1dLCBzID0gcG1fUGxhY2VudGFfbWFsZV9QUkVET19uW2ksIGxhbWJkYV0pKSkgLS0+CjwhLS0gICAgICAgICAgICAgICAgKSAtLT4KPCEtLSAgICkgLS0+CjwhLS0gfSAtLT4KCjwhLS0gcG0yX1BsYWNlbnRhX21hbGVfUFJFRE9fbiAtLT4KPCEtLSBgYGAgLS0+CgoKPCEtLSBgYGB7cn0gLS0+CjwhLS0gIyBzYXZlICJwcmVmZXJhYmxlIG1vZGVscyIgLS0+CjwhLS0gc2F2ZShwbTJfUGxhY2VudGFfbWFsZV9QUkVET19uLCBmaWxlPSJJbnB1dERhdGEvRGF0YV9FbGFzdGljTmV0cy9wbTJfUGxhY2VudGFfbWFsZV9QUkVET19uLlJkYXRhIikgLS0+CjwhLS0gYGBgIC0tPgoKCmBgYHtyfQpsb2FkKCJJbnB1dERhdGEvRGF0YV9FbGFzdGljTmV0cy9wbTJfUGxhY2VudGFfbWFsZV9QUkVET19uLlJkYXRhIikKIyBjb2VmZmljaWVudCB2YWx1ZXMgZm9yIHRoZSBtb2RlbHMgd2l0aCBzbWFsbGVzdCBjdm0gYnkgbnVtYmVyIG9mIG5vbi1lcnpvIGNvZWZmaWNpZW50cyBhbmQgYm9vdHN0cmFwCmBgYAoKCmBgYHtyfQpjc3VtbWFyeV9QbGFjZW50YV9tYWxlX1BSRURPX24gPC0gUmVkdWNlKGZ1bmN0aW9uKHgseSkgbWVyZ2UoeCA9IHgsIHkgPSB5LCBieSA9ICJuemVybyIpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdChwbTJfUGxhY2VudGFfbWFsZV9QUkVET19uWywgbGFwcGx5KC5TRCwgZnVuY3Rpb24oeCkge21lYW4oeCAhPSAwKX0pLCAuU0Rjb2xzID0gYygiQmlydGhfV2VpZ2h0IiwgIkJpcnRoX0xlbmd0aCIsICJIZWFkX0NpcmN1bWZlcmVuY2VfYXRfQmlydGgiLCAiRGVsaXZlcnlfTW9kZV9kaWNob3RvbWFpZGVkIiwgImluZHVjZWRsYWJvdXJZZXMiLCAiUGFyaXR5X2RpY2hvdG9tZ2l2ZW4gYmlydGggYmVmb3JlIiwgIk1hdGVybmFsX0FnZV8xOFBvcFJlZ2FuZEJSIiwgIk1hdGVybmFsX1ByZXByZWduYW5jeUJNSTE4b2N0MjhuZXciLCAibWF0ZXJuYWxfaHlwZXJ0ZW5zaW9uX2RpY2hvdG9taHlwZXJ0ZW5zaW9uIGluIGN1cnJlbnQgcHJlZ25hbmN5IiwibWF0ZXJuYWxfZGlhYmV0ZXNfZGljaG90b21kaWFiZXRlcyBpbiBjdXJyZW50IHByZWduYW5jeSIsIk1hdGVybmFsX01lbnRhbF9EaXNvcmRlcnNfQnlfQ2hpbGRiaXJ0aFllcyIsInNtb2tpbmdfZGljaG90b215ZXMiKSwgYnkgPSBuemVyb10KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG0yX1BsYWNlbnRhX21hbGVfUFJFRE9fblssIC4obWVhbl9jdm0gPSBtZWFuKGN2bSkpLCBieSA9IG56ZXJvXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbTJfUGxhY2VudGFfbWFsZV9QUkVET19uWywgLihtZWRpYW5fY3ZtID0gbWVkaWFuKGN2bSkpLCBieSA9IG56ZXJvXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApKVtvcmRlcihuemVybyldCgpjc3VtbWFyeV9QbGFjZW50YV9tYWxlX1BSRURPX24KYGBgCgoKYGBge3J9CmcxX1BsYWNlbnRhX21hbGVfUFJFRE9fbiA8LQogIGNzdW1tYXJ5X1BsYWNlbnRhX21hbGVfUFJFRE9fbiAlPiUKICBtZWx0KGlkLnZhcnMgPSBjKCJuemVybyIsICJtZWFuX2N2bSIsICJtZWRpYW5fY3ZtIikpICU+JQogIGdncGxvdDI6OmdncGxvdCguKSArCiAgZ2dwbG90Mjo6dGhlbWVfYncoKSArCiAgZ2dwbG90Mjo6YWVzKHggPSBuemVybykgKwogIGdncGxvdDI6Omdlb21fcG9pbnQobWFwcGluZyA9IGdncGxvdDI6OmFlcyh5ID0gdmFyaWFibGUsIHNpemUgPSB2YWx1ZSwgYWxwaGEgPSB2YWx1ZSwgY29sb3IgPSB2YWx1ZSoxMDApKSArCiAgZ2dwbG90Mjo6c2NhbGVfY29sb3JfZ3JhZGllbnQyKGhpZ2ggPSAnZ3JlZW4nLCBtaWQgPSAicHVycGxlIiwgbG93ID0gImJsYWNrIiwgbWlkcG9pbnQgPTUwKSsKICBnZ3Bsb3QyOjpzY2FsZV9hbHBoYShndWlkZSA9ICdub25lJykrCiAgZ2dwbG90Mjo6c2NhbGVfc2l6ZShndWlkZSA9ICdub25lJykrCiAgZ2dwbG90Mjo6c2NhbGVfeV9kaXNjcmV0ZShsYWJlbHM9IGMoImJpcnRoIHdlaWdodCIsICJiaXJ0aCBsZW5ndGgiLCAiaGVhZCBjaXJjdW1mZXJlbmNlIiwgImRlbGl2ZXJ5IG1vZGUiLCAiaW5kdWNlZCBsYWJvciIsICJwYXJpdHkiLCAibWF0ZXJuYWwgYWdlIiwgIm1hdGVybmFsIEJNSSIsICJtYXRlcm5hbCBoeXBlcnRlbnNpb24iLCAibWF0ZXJuYWwgZGlhYmV0ZXMiLCAibWF0ZXJuYWwgbWVudGFsIGRpc29yZGVycyIsICJtYXRlcm5hbCBzbW9raW5nIikpKwogIGdncGxvdDI6OnNjYWxlX3hfY29udGludW91cyhicmVha3M9MDoxNCwgbGFiZWxzPSkrCiAgZ2dwbG90Mjo6bGFicyh5PSJwcmVkaWN0b3IiLCB4ID0gIm51bWJlciBvZiBub24temVybyBjb2VmZmljaWVudHMiLCBjb2xvcj0iJSIpKwogIGdncGxvdDI6OnRoZW1lKHRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE1KSwgYXhpcy50aXRsZS54PSBlbGVtZW50X3RleHQoc2l6ZT0xNSksIGF4aXMudGl0bGUueT0gZWxlbWVudF90ZXh0KHNpemU9MTUpKQogIAoKZzJfUGxhY2VudGFfbWFsZV9QUkVET19uIDwtCiAgY3N1bW1hcnlfUGxhY2VudGFfbWFsZV9QUkVET19uICU+JQogIGdncGxvdDI6OmdncGxvdCguKSArCiAgZ2dwbG90Mjo6dGhlbWVfYncoKSArCiAgZ2dwbG90Mjo6YWVzKHggPSBuemVybywgeSA9IG1lZGlhbl9jdm0pICsKICBnZ3Bsb3QyOjpnZW9tX3BvaW50KCkgKyBnZ3Bsb3QyOjpnZW9tX2xpbmUoKSsKICBnZ3Bsb3QyOjpsYWJzKHk9Im1lZGlhbiBjdm0iLCB4ID0gIm51bWJlciBvZiBub24temVybyBjb2VmZmljaWVudHMiKSsKICBnZ3Bsb3QyOjpzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzPTA6MTQsIGxhYmVscz0pKwogIGdncGxvdDI6OnRoZW1lKGF4aXMudGV4dD1lbGVtZW50X3RleHQoc2l6ZT0xNSksYXhpcy50aXRsZT1lbGVtZW50X3RleHQoc2l6ZT0xOCkpCgpncmlkRXh0cmE6OmdyaWQuYXJyYW5nZShnMV9QbGFjZW50YV9tYWxlX1BSRURPX24sIGcyX1BsYWNlbnRhX21hbGVfUFJFRE9fbiwgbmNvbCA9IDEpCgpgYGAKCgpgYGB7cn0KcG5nKGZpbGVuYW1lPSJSZXN1bHRzL0ZpZ3VyZXMvZWxhc3RpY05ldF9zaW5nbGVUaXNzdWVzL091dGNvbWVfYWRkL3NleF9zcGxpdC9ib290c3RyYXBNb2RlbHNfUGxhY2VudGFfUFJFRE9fbWFsZS5wbmciLCB3aWR0aD0yNDAwLCBoZWlnaHQ9MTgwMCwgcmVzPTMwMCkKZ3JpZEV4dHJhOjpncmlkLmFycmFuZ2UoZzFfUGxhY2VudGFfbWFsZV9QUkVET19uLCBnMl9QbGFjZW50YV9tYWxlX1BSRURPX24sIG5jb2wgPSAxKQpkZXYub2ZmKCkKYGBgCgpgYGB7cn0KcG5nKGZpbGVuYW1lPSJSZXN1bHRzL0ZpZ3VyZXMvZWxhc3RpY05ldF9zaW5nbGVUaXNzdWVzL091dGNvbWVfYWRkL3NleF9zcGxpdC9Nb2RlbF9QbGFjZW50YV9QUkVET19tYWxlLnBuZyIsIHdpZHRoPTI4MDAsIGhlaWdodD0xNDAwLCByZXM9NDAwKQpnMV9QbGFjZW50YV9tYWxlX1BSRURPX24KZGV2Lm9mZigpCmBgYAoKYGBge3J9CmVsYm93X2ZpbmRlcihjc3VtbWFyeV9QbGFjZW50YV9tYWxlX1BSRURPX24kbnplcm8sIGNzdW1tYXJ5X1BsYWNlbnRhX21hbGVfUFJFRE9fbiRtZWRpYW5fY3ZtKQoKbnplcm9faW5kaWNlc19Db3JkIDwtIGRhdGEuZnJhbWUodChlbGJvd19maW5kZXIoY3N1bW1hcnlfUGxhY2VudGFfbWFsZV9QUkVET19uJG56ZXJvLCBjc3VtbWFyeV9QbGFjZW50YV9tYWxlX1BSRURPX24kbWVkaWFuX2N2bSkpKQpjb2xuYW1lcyhuemVyb19pbmRpY2VzX0NvcmQpIDwtIGMoIngiLCAieSIpCnJvd25hbWVzKG56ZXJvX2luZGljZXNfQ29yZCkgPC0gTlVMTApgYGAKYGBge3J9Cm56ZXJvX2ZpbmFsX3BsYWNlbnRhX21hbGUgPC0gNQpgYGAKCgpgYGB7cn0KY3N1bW1hcnlfUGxhY2VudGFfbWFsZV9QUkVET19uW256ZXJvICVpbiUgbnplcm9fZmluYWxfcGxhY2VudGFfbWFsZV0KYGBgCgpgYGB7cn0Kbm9uemVyb19jaG9vc2VfUGxhY2VudGFfbWFsZSA8LSBnZ3Bsb3QyOjpnZ3Bsb3QoY3N1bW1hcnlfUGxhY2VudGFfbWFsZV9QUkVET19uKSArCiAgZ2dwbG90Mjo6dGhlbWVfYncoKSsKICBnZ3Bsb3QyOjphZXMoeCA9IG56ZXJvLCB5ID0gbWVkaWFuX2N2bSkgKwogIGdncGxvdDI6OnNjYWxlX3hfY29udGludW91cyhicmVha3M9YygwOjE3KSkrCiAgZ2dwbG90Mjo6Z2VvbV9wb2ludCgpICsgZ2dwbG90Mjo6Z2VvbV9saW5lKCkrCiAgZ2dwbG90Mjo6Z2VvbV9wb2ludChkYXRhPW56ZXJvX2luZGljZXNfQ29yZCwgYWVzKHg9eCwgeT15KSwgY29sb3VyPSJyZWQiLCBzaXplPTIpKwogIGdncGxvdDI6OnlsYWIoIm1lZGlhbiBvZiBtaW5pbXVtIGNyb3NzLXZhbGlkYXRpb24gZXJyb3JzIG92ZXIgYm9vdHN0cmFwcyIpKwogIGdncGxvdDI6OnhsYWIoIm51bWJlciBvZiBub24temVybyBjb2VmZmljaWVudHMiKSsKICBnZ3Bsb3QyOjpnZW9tX3NlZ21lbnQoYWVzKHggPSBuemVyb1sxXSwgeSA9IG1lZGlhbl9jdm1bMV0sIHhlbmQgPSBuemVyb1sxM10sIHllbmQgPSBtZWRpYW5fY3ZtWzEzXSwgY29sb3VyID0gInNlZ21lbnQiKSwgZGF0YSA9IGNzdW1tYXJ5X1BsYWNlbnRhX21hbGVfUFJFRE9fbiwgc2hvdy5sZWdlbmQgPSBGKQoKbm9uemVyb19jaG9vc2VfUGxhY2VudGFfbWFsZQpgYGAKCmBgYHtyfQpwbmcoZmlsZW5hbWU9IlJlc3VsdHMvRmlndXJlcy9lbGFzdGljTmV0X3NpbmdsZVRpc3N1ZXMvT3V0Y29tZV9hZGQvc2V4X3NwbGl0L256ZXJvX2Nob29zZV9QbGFjZW50YV9QUkVET19tYWxlLnBuZyIsIHdpZHRoPTE2MDAsIGhlaWdodD0xNDAwLCByZXM9MzAwKQpub256ZXJvX2Nob29zZV9QbGFjZW50YV9tYWxlCmRldi5vZmYoKQpgYGAKCgpgYGB7cn0Kc3VtbWFyeV9QbGFjZW50YV9tYWxlX1BSRURPX25fZmluYWxuemVybyA8LSBjc3VtbWFyeV9QbGFjZW50YV9tYWxlX1BSRURPX25bbnplcm8gJWluJSBuemVyb19maW5hbF9wbGFjZW50YV9tYWxlXQpzaWdfdmFyX25hbWVzX1BsYWNlbnRhX21hbGVfUFJFRE9fbl9maW5hbG56ZXJvIDwtIEZpbHRlcihmdW5jdGlvbih4KSBhbnkoeCA+IDAuNzUpLCBzdW1tYXJ5X1BsYWNlbnRhX21hbGVfUFJFRE9fbl9maW5hbG56ZXJvWywhYygibnplcm8iLCAibWVhbl9jdm0iLCAibWVkaWFuX2N2bSIpXSkgJT4lIGNvbG5hbWVzKCkKY29sbmFtZXMoc3VtbWFyeV9QbGFjZW50YV9tYWxlX1BSRURPX25fZmluYWxuemVybykgPC0gYygibm9uLXplcm8iLCAiYmlydGggd2VpZ2h0IiwgImJpcnRoIGxlbmd0aCIsICJoZWFkIGNpcmN1bWZlcmVuY2UiLCAiZGVsaXZlcnkgbW9kZSAoYWlkZWQpIiwgImluZHVjZWQgbGFib3IgKHllcykiLCAicGFyaXR5IChiaXJ0aCBiZWZvcmUpIiwgIm1hdGVybmFsIGFnZSIsICJtYXRlcm5hbCBCTUkiLCAibWF0ZXJuYWwgaHlwZXJ0ZW5zaW9uICh5ZXMpIiwgIm1hdGVybmFsIGRpYWJldGVzICh5ZXMpIiwgIm1hdGVybmFsIG1lbnRhbCBkaXNvcmRlcnMgKHllcykiLCAibWF0ZXJuYWwgc21va2luZyAoeWVzKSIsICJtZWFuIGN2bSIsICJtZWRpYW4gY3ZtIikKc3VtbWFyeV9QbGFjZW50YV9tYWxlX1BSRURPX25fZmluYWxuemVyb1QgPC0gYXMuZGF0YS5mcmFtZSh0KHN1bW1hcnlfUGxhY2VudGFfbWFsZV9QUkVET19uX2ZpbmFsbnplcm9bLC1jKCJub24temVybyIsICJtZWRpYW4gY3ZtIiwgIm1lYW4gY3ZtIildKSkKc3VtbWFyeV9QbGFjZW50YV9tYWxlX1BSRURPX25fZmluYWxuemVyb1QkdmFyaWFibGUgPC0gcm93bmFtZXMoc3VtbWFyeV9QbGFjZW50YV9tYWxlX1BSRURPX25fZmluYWxuemVyb1QpCnJvd25hbWVzKHN1bW1hcnlfUGxhY2VudGFfbWFsZV9QUkVET19uX2ZpbmFsbnplcm9UKSA8LSBOVUxMCm5hbWVzKHN1bW1hcnlfUGxhY2VudGFfbWFsZV9QUkVET19uX2ZpbmFsbnplcm9UKVtuYW1lcyhzdW1tYXJ5X1BsYWNlbnRhX21hbGVfUFJFRE9fbl9maW5hbG56ZXJvVCkgPT0gJ1YxJ10gPC0gJ3BlcmNlbnQnCnN1bW1hcnlfUGxhY2VudGFfbWFsZV9QUkVET19uX2ZpbmFsbnplcm9UIDwtIHN1bW1hcnlfUGxhY2VudGFfbWFsZV9QUkVET19uX2ZpbmFsbnplcm9UW29yZGVyKHN1bW1hcnlfUGxhY2VudGFfbWFsZV9QUkVET19uX2ZpbmFsbnplcm9UJHBlcmNlbnQpLF0KCnN1bW1hcnlfUGxhY2VudGFfbWFsZV9QUkVET19uX2ZpbmFsbnplcm9UJG51bWJlciA8LSBzZXEoMSwgbGVuZ3RoKHN1bW1hcnlfUGxhY2VudGFfbWFsZV9QUkVET19uX2ZpbmFsbnplcm9UJHZhcmlhYmxlKSkKYGBgCgpgYGB7ciwgZmlnLndpZHRoPTh9CnBlcmNfdmFyc19QbGFjZW50YV9tYWxlX1BSRURPX24gPC0gCiAgZ2dwbG90KHN1bW1hcnlfUGxhY2VudGFfbWFsZV9QUkVET19uX2ZpbmFsbnplcm9ULCBhZXMocmVvcmRlcih2YXJpYWJsZSwgcGVyY2VudCksIHBlcmNlbnQsIGdyb3VwPTEpKSsKICBnZW9tX3BvaW50KCkrIGdlb21fbGluZSgpKwogIHlsYWIoIiUgb2NjdXJlbmNlIGluIG1vZGVscyB3aXRoIG56ZXJvIGNvZWZmaWNpZW50cyA9IDUiKSsKICBzY2FsZV95X2NvbnRpbnVvdXMoYnJlYWtzPWMoMC4xLDAuMiwwLjMsMC40LDAuNSwwLjYsMC43LDAuOCwwLjkpKSsKICB4bGFiKCJ2YXJpYWJsZSIpKwogIGNvb3JkX2ZsaXAoKSsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQ9MC43NSwgbGluZXR5cGU9ImRvdHRlZCIpKwogIHRoZW1lX2J3KCkKCnBlcmNfdmFyc19QbGFjZW50YV9tYWxlX1BSRURPX24KCiMgZGVjaWRlIGZvciBjdXQtb2ZmICUgLT4gaGVyZSAuNzUKCkZpbHRlcihmdW5jdGlvbih4KSBhbnkoeCA+IDAuNzUpLCBzdW1tYXJ5X1BsYWNlbnRhX21hbGVfUFJFRE9fbl9maW5hbG56ZXJvWywhYygibm9uLXplcm8iLCAibWVhbiBjdm0iLCAibWVkaWFuIGN2bSIpXSkKCmBgYAoKCmBgYHtyfQpwbmcoZmlsZW5hbWU9IlJlc3VsdHMvRmlndXJlcy9lbGFzdGljTmV0X3NpbmdsZVRpc3N1ZXMvT3V0Y29tZV9hZGQvc2V4X3NwbGl0L3ZhcnNQZXJjZW50X1BsYWNlbnRhX21hbGUucG5nIiwgd2lkdGg9MTEwMCwgaGVpZ2h0PTE0MDAsIHJlcz0zMDApCnBlcmNfdmFyc19QbGFjZW50YV9tYWxlX1BSRURPX24KZGV2Lm9mZigpCmBgYAoKCiAgCmBgYHtyfQpwbTJfUGxhY2VudGFfbWFsZV9QUkVET19uX2NvZWYgPC0KICBkY2FzdChwbTJfUGxhY2VudGFfbWFsZV9QUkVET19uWywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcy5saXN0KHVubGlzdCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcHBseSguU0QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24oeCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeSA8LSB1bm5hbWUocXVhbnRpbGUoeFt4ICE9IDBdLCBwcm9icyA9IGMoMC4wMjUsIDAuOTc1KSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0KCJub25femVybyIgPSAxMDAgKiBtZWFuKHggIT0gMCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxjbCA9IHlbMV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVjbCA9IHlbMl0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoID0gZGlmZih5KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFuID0gbWVkaWFuKHhbeCE9IDBdKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSkpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5TRGNvbHMgPSBjKCJCaXJ0aF9XZWlnaHQiLCAiQmlydGhfTGVuZ3RoIiwgIkhlYWRfQ2lyY3VtZmVyZW5jZV9hdF9CaXJ0aCIsICJEZWxpdmVyeV9Nb2RlX2RpY2hvdG9tYWlkZWQiLCAiaW5kdWNlZGxhYm91clllcyIsICJQYXJpdHlfZGljaG90b21naXZlbiBiaXJ0aCBiZWZvcmUiLCAiTWF0ZXJuYWxfQWdlXzE4UG9wUmVnYW5kQlIiLCAiTWF0ZXJuYWxfUHJlcHJlZ25hbmN5Qk1JMThvY3QyOG5ldyIsICJtYXRlcm5hbF9oeXBlcnRlbnNpb25fZGljaG90b21oeXBlcnRlbnNpb24gaW4gY3VycmVudCBwcmVnbmFuY3kiLCJtYXRlcm5hbF9kaWFiZXRlc19kaWNob3RvbWRpYWJldGVzIGluIGN1cnJlbnQgcHJlZ25hbmN5IiwiTWF0ZXJuYWxfTWVudGFsX0Rpc29yZGVyc19CeV9DaGlsZGJpcnRoWWVzIiwic21va2luZ19kaWNob3RvbXllcyIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5ID0gbnplcm9dW29yZGVyKG56ZXJvKV0gJT4lCiAgICAgICAgICBtZWx0KGlkLnZhciA9ICJuemVybyIpICU+JQogICAgICAgICAgLlssIG1ldHJpYyA6PSBzdWIoIl4uK1xcLiguKykkIiwgIlxcMSIsIHZhcmlhYmxlKV0gJT4lCiAgICAgICAgICAuWywgdmFyaWFibGUgOj0gc3ViKCJeKC4rKVxcLi4rJCIsICJcXDEiLCB2YXJpYWJsZSldICU+JQogICAgICAgICAgLltuemVybyA9PW56ZXJvX2ZpbmFsX3BsYWNlbnRhX21hbGVdLCBuemVybysgdmFyaWFibGUgfiBtZXRyaWMsIHZhbHVlLnZhcj0idmFsdWUiKQoKIyBnZXQgZGVzaXJlZCBvcmRlciBvZiBwcmVkaWN0b3JzCnBtMl9QbGFjZW50YV9tYWxlX1BSRURPX25fY29lZiA8LQogIHBtMl9QbGFjZW50YV9tYWxlX1BSRURPX25fY29lZlttYXRjaChjKCJCaXJ0aF9XZWlnaHQiLCAiQmlydGhfTGVuZ3RoIiwgIkhlYWRfQ2lyY3VtZmVyZW5jZV9hdF9CaXJ0aCIsICJEZWxpdmVyeV9Nb2RlX2RpY2hvdG9tYWlkZWQiLCAiaW5kdWNlZGxhYm91clllcyIsICJQYXJpdHlfZGljaG90b21naXZlbiBiaXJ0aCBiZWZvcmUiLCAiTWF0ZXJuYWxfQWdlXzE4UG9wUmVnYW5kQlIiLCAiTWF0ZXJuYWxfUHJlcHJlZ25hbmN5Qk1JMThvY3QyOG5ldyIsICJtYXRlcm5hbF9oeXBlcnRlbnNpb25fZGljaG90b21oeXBlcnRlbnNpb24gaW4gY3VycmVudCBwcmVnbmFuY3kiLCJtYXRlcm5hbF9kaWFiZXRlc19kaWNob3RvbWRpYWJldGVzIGluIGN1cnJlbnQgcHJlZ25hbmN5IiwiTWF0ZXJuYWxfTWVudGFsX0Rpc29yZGVyc19CeV9DaGlsZGJpcnRoWWVzIiwic21va2luZ19kaWNob3RvbXllcyIpLCBwbTJfUGxhY2VudGFfbWFsZV9QUkVET19uX2NvZWYkdmFyaWFibGUpLF0KcG0yX1BsYWNlbnRhX21hbGVfUFJFRE9fbl9jb2VmJHZhcmlhYmxlIDwtIGZhY3RvcihwbTJfUGxhY2VudGFfbWFsZV9QUkVET19uX2NvZWYkdmFyaWFibCwgbGV2ZWxzPXVuaXF1ZShwbTJfUGxhY2VudGFfbWFsZV9QUkVET19uX2NvZWYkdmFyaWFibGUpKQoKIyMgTk9URTogbWVkaWFuIGlzIHVzZWQgaGVyZSBpbnN0ZWFkIG9mIG1lYW4KIyBtYWtlIGZyYW1lIGZvciBvbmx5IHNpZ25pZmljYW50IHZhcmlhYmxlczoKcG0yX1BsYWNlbnRhX21hbGVfUFJFRE9fbl9kYXRhYmxlIDwtIGRjYXN0KHBtMl9QbGFjZW50YV9tYWxlX1BSRURPX25bLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzLmxpc3QodW5saXN0KAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwcGx5KC5TRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbih4KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5IDwtIHVubmFtZShxdWFudGlsZSh4W3ggIT0gMF0sIHByb2JzID0gYygwLjAyNSwgMC45NzUpKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3QoIm5vbl96ZXJvIiA9IDEwMCAqIG1lYW4oeCAhPSAwKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGNsID0geVsxXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWNsID0geVsyXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGggPSBkaWZmKHkpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYW4gPSBtZWRpYW4oeFt4IT0gMF0pKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLlNEY29scyA9IGMoIkJpcnRoX1dlaWdodCIsICJCaXJ0aF9MZW5ndGgiLCAiSGVhZF9DaXJjdW1mZXJlbmNlX2F0X0JpcnRoIiwgIkRlbGl2ZXJ5X01vZGVfZGljaG90b21haWRlZCIsICJpbmR1Y2VkbGFib3VyWWVzIiwgIlBhcml0eV9kaWNob3RvbWdpdmVuIGJpcnRoIGJlZm9yZSIsICJNYXRlcm5hbF9BZ2VfMThQb3BSZWdhbmRCUiIsICJNYXRlcm5hbF9QcmVwcmVnbmFuY3lCTUkxOG9jdDI4bmV3IiwgIm1hdGVybmFsX2h5cGVydGVuc2lvbl9kaWNob3RvbWh5cGVydGVuc2lvbiBpbiBjdXJyZW50IHByZWduYW5jeSIsIm1hdGVybmFsX2RpYWJldGVzX2RpY2hvdG9tZGlhYmV0ZXMgaW4gY3VycmVudCBwcmVnbmFuY3kiLCJNYXRlcm5hbF9NZW50YWxfRGlzb3JkZXJzX0J5X0NoaWxkYmlydGhZZXMiLCJzbW9raW5nX2RpY2hvdG9teWVzIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnkgPSBuemVyb11bb3JkZXIobnplcm8pXSAlPiUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbHQoaWQudmFyID0gIm56ZXJvIikgJT4lCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuWywgbWV0cmljIDo9IHN1YigiXi4rXFwuKC4rKSQiLCAiXFwxIiwgdmFyaWFibGUpXSAlPiUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5bLCB2YXJpYWJsZSA6PSBzdWIoIl4oLispXFwuLiskIiwgIlxcMSIsIHZhcmlhYmxlKV0gJT4lCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHByaW50ICU+JQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLltuemVybyA9PSBuemVyb19maW5hbF9wbGFjZW50YV9tYWxlICYgdmFyaWFibGUgJWluJSBzaWdfdmFyX25hbWVzX1BsYWNlbnRhX21hbGVfUFJFRE9fbl9maW5hbG56ZXJvXSwgbnplcm8rIHZhcmlhYmxlIH4gbWV0cmljLCB2YWx1ZS52YXI9InZhbHVlIikKCnBtMl9QbGFjZW50YV9tYWxlX1BSRURPX25fZGF0YWJsZQoKYGBgCgoKYGBge3J9CnNpZ192YXJzX1BsYWNlbnRhX21hbGVfUFJFRE9fbiA8LQogIHBtMl9QbGFjZW50YV9tYWxlX1BSRURPX25fY29lZiAlPiUKICBnZ3Bsb3QyOjpnZ3Bsb3QoLikgKwogIGdncGxvdDI6OnRoZW1lX2J3KCkgKwogIGdncGxvdDI6OnRoZW1lKGF4aXMudGV4dC54PWVsZW1lbnRfYmxhbmsoKSkrCiAgZ2dwbG90Mjo6YWVzKHg9Im56ZXJvIikrCiAgZ2dwbG90Mjo6Z2VvbV9wb2ludChtYXBwaW5nID0gZ2dwbG90Mjo6YWVzKHkgPSB2YXJpYWJsZSwgc2l6ZSA9bm9uX3plcm8sIGFscGhhID0gbm9uX3plcm8sIGNvbG9yID0gbm9uX3plcm8pKSArCiAgZ2dwbG90Mjo6Z2VvbV90ZXh0KGFlcyh5PXZhcmlhYmxlLCBsYWJlbD1zcHJpbnRmKCIlMC4yZiIsIHJvdW5kKG1lZGlhbiwgZGlnaXRzPTIpKSwgc2l6ZT01MCksaGp1c3Q9MCwgdmp1c3Q9MC41LCBudWRnZV94ID0gMC4xKSsKICBnZ3Bsb3QyOjpzY2FsZV9jb2xvcl9ncmFkaWVudDIoaGlnaCA9ICdncmVlbicsIG1pZCA9ICJwdXJwbGUiLCBsb3cgPSAiYmxhY2siLCBtaWRwb2ludCA9NTApKwogIGdncGxvdDI6OnNjYWxlX2FscGhhKGd1aWRlID0gJ25vbmUnKSsKICBnZ3Bsb3QyOjpzY2FsZV9zaXplKGd1aWRlID0gJ25vbmUnKSsKICBnZ3Bsb3QyOjpzY2FsZV95X2Rpc2NyZXRlKGxhYmVscz0gYygiYmlydGggd2VpZ2h0IiwgImJpcnRoIGxlbmd0aCIsICJoZWFkIGNpcmN1bWZlcmVuY2UiLCAiZGVsaXZlcnkgbW9kZSAoYWlkZWQpIiwgImluZHVjZWQgbGFib3IgKHllcykiLCAicGFyaXR5IChiaXJ0aCBiZWZvcmUpIiwgIm1hdGVybmFsIGFnZSIsICJtYXRlcm5hbCBCTUkiLCAibWF0ZXJuYWwgaHlwZXJ0ZW5zaW9uICh5ZXMpIiwgIm1hdGVybmFsIGRpYWJldGVzICh5ZXMpIiwgIm1hdGVybmFsIG1lbnRhbCBkaXNvcmRlcnMgKHllcykiLCAibWF0ZXJuYWwgc21va2luZyAoeWVzKSIpKSsKICBnZ3Bsb3QyOjpsYWJzKHk9InByZWRpY3RvciIsIHggPSAibnVtYmVyIG9mIG5vbi16ZXJvIGNvZWZmaWNpZW50cyA9IDUiLCBjb2xvcj0iJSIpCmBgYAoKYGBge3J9CmNvZWZfUGxhY2VudGFfbWFsZV9QUkVET19uIDwtIAogIGdncGxvdChwbTJfUGxhY2VudGFfbWFsZV9QUkVET19uX2NvZWYsIGFlcyh5ID0gdmFyaWFibGUsIHg9bWVkaWFuKSkrCiAgZ2VvbV9wb2ludChtYXBwaW5nID0gZ2dwbG90Mjo6YWVzKHkgPSB2YXJpYWJsZSwgc2l6ZSA9bm9uX3plcm8sIGFscGhhID0gbm9uX3plcm8sIGNvbG9yID0gbm9uX3plcm8pKSsKICBzY2FsZV9jb2xvcl9ncmFkaWVudDIoaGlnaCA9ICdncmVlbicsIG1pZCA9ICJwdXJwbGUiLCBsb3cgPSAiYmxhY2siLCBtaWRwb2ludCA9NTAsIGxpbWl0cz1jKDAsMTAwKSkrCiAgc2NhbGVfYWxwaGEoZ3VpZGUgPSAnbm9uZScpKwogIHNjYWxlX3NpemUoZ3VpZGUgPSAnbm9uZScpKwogIGdlb21fcG9pbnQoKSsKICBnZW9tX2Vycm9yYmFyKGFlcyh5ID0gdmFyaWFibGUsIHhtaW4gPSBsY2wsIHhtYXggPSB1Y2wpLCB3aWR0aCA9IDAuMikrCiAgbGFicyh5PSJwcmVkaWN0b3IiLCB4ID0gIlxubWVkaWFuICYgOTUlIENJIG9mIGNvZWZmaWNpZW50IChvdmVyIGJvb3RzdHJhcHMpIiwgY29sb3I9IiUiKSsKICBzY2FsZV94X2NvbnRpbnVvdXMobGltaXRzPWMoLTAuNCwwLjQpLCBicmVha3M9YygtLjQsLS4zLC0uMiwgLS4xLCAwLCAuMSwgLjIsIC4zLCAuNCkpKwogIHNjYWxlX3lfZGlzY3JldGUobGFiZWxzPSBjKCJiaXJ0aCB3ZWlnaHQiLCAiYmlydGggbGVuZ3RoIiwgImhlYWQgY2lyY3VtZmVyZW5jZSIsICJkZWxpdmVyeSBtb2RlIChhaWRlZCkiLCAiaW5kdWNlZCBsYWJvciAoeWVzKSIsICJwYXJpdHkgKGJpcnRoIGJlZm9yZSkiLCAibWF0ZXJuYWwgYWdlIiwgIm1hdGVybmFsIEJNSSIsICJtYXRlcm5hbCBoeXBlcnRlbnNpb24gKHllcykiLCAibWF0ZXJuYWwgZGlhYmV0ZXMgKHllcykiLCAibWF0ZXJuYWwgbWVudGFsIGRpc29yZGVycyAoeWVzKSIsICJtYXRlcm5hbCBzbW9raW5nICh5ZXMpIikpKwogIGdlb21fdmxpbmUoeGludGVyY2VwdD0wLCBsaW5ldHlwZT0iZGFzaGVkIikrCiAgdGhlbWVfYncoKSsKICB0aGVtZSh0ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNSksIGF4aXMudGl0bGUueD0gZWxlbWVudF90ZXh0KHNpemU9MTUpLCBheGlzLnRpdGxlLnk9IGVsZW1lbnRfdGV4dChzaXplPTE1KSkKCgpjb2VmX1BsYWNlbnRhX21hbGVfUFJFRE9fbgpgYGAKCgpgYGB7cn0KcG5nKGZpbGVuYW1lPSJSZXN1bHRzL0ZpZ3VyZXMvZWxhc3RpY05ldF9zaW5nbGVUaXNzdWVzL091dGNvbWVfYWRkL3NleF9zcGxpdC9jb2VmX1BsYWNlbnRhX1BSRURPX21hbGUucG5nIiwgd2lkdGg9MjgwMCwgaGVpZ2h0PTE0MDAsIHJlcz00MDApCmNvZWZfUGxhY2VudGFfbWFsZV9QUkVET19uCmRldi5vZmYoKQpgYGAKCgpgYGB7cn0KcDEgPC0KICBjc3VtbWFyeV9QbGFjZW50YV9tYWxlX1BSRURPX24gJT4lCiAgbWVsdChpZC52YXJzID0gYygibnplcm8iLCAibWVhbl9jdm0iLCAibWVkaWFuX2N2bSIpKSAlPiUKICBnZ3Bsb3QyOjpnZ3Bsb3QoLikgKwogIGdncGxvdDI6OnRoZW1lX2J3KCkgKwogIGdncGxvdDI6OmFlcyh4ID0gbnplcm8pICsKICBnZ3Bsb3QyOjpnZW9tX3BvaW50KG1hcHBpbmcgPSBnZ3Bsb3QyOjphZXMoeSA9IHZhcmlhYmxlLCBzaXplID0gdmFsdWUsIGFscGhhID0gdmFsdWUsIGNvbG9yID0gdmFsdWUqMTAwKSkgKwogIGdncGxvdDI6OnNjYWxlX2NvbG9yX2dyYWRpZW50MihoaWdoID0gJ2dyZWVuJywgbWlkID0gInB1cnBsZSIsIGxvdyA9ICJibGFjayIsIG1pZHBvaW50ID01MCkrCiAgZ2dwbG90Mjo6c2NhbGVfYWxwaGEoZ3VpZGUgPSAnbm9uZScpKwogIGdncGxvdDI6OnNjYWxlX3NpemUoZ3VpZGUgPSAnbm9uZScpKwogIGdncGxvdDI6OnNjYWxlX3lfZGlzY3JldGUobGFiZWxzPSBjKCJiaXJ0aCB3ZWlnaHQiLCAiYmlydGggbGVuZ3RoIiwgImhlYWQgY2lyY3VtZmVyZW5jZSIsICJkZWxpdmVyeSBtb2RlIChhaWRlZCkiLCAiaW5kdWNlZCBsYWJvciAoeWVzKSIsICJwYXJpdHkgKGJpcnRoIGJlZm9yZSkiLCAibWF0ZXJuYWwgYWdlIiwgIm1hdGVybmFsIEJNSSIsICJtYXRlcm5hbCBoeXBlcnRlbnNpb24gKHllcykiLCAibWF0ZXJuYWwgZGlhYmV0ZXMgKHllcykiLCAibWF0ZXJuYWwgbWVudGFsIGRpc29yZGVycyAoeWVzKSIsICJtYXRlcm5hbCBzbW9raW5nICh5ZXMpIikpKwogIGdncGxvdDI6OnNjYWxlX3hfY29udGludW91cyhicmVha3M9MDoxNCwgbGFiZWxzPSkrCiAgZ2dwbG90Mjo6bGFicyh5PSJwcmVkaWN0b3IiLCB4ID0gIlxubnVtYmVyIG9mIG5vbi16ZXJvIGNvZWZmaWNpZW50cyIsIGNvbG9yPSIlIikrCiAgZ2dwbG90Mjo6dGhlbWUodGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTcpLCBheGlzLnRpdGxlLng9IGVsZW1lbnRfdGV4dChzaXplPTE1KSwgYXhpcy50aXRsZS55PSBlbGVtZW50X3RleHQoc2l6ZT0xNSksIGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikKICAKcDIgPC0gCmNvZWZfUGxhY2VudGFfbWFsZV9QUkVET19uIDwtIAogIGdncGxvdChwbTJfUGxhY2VudGFfbWFsZV9QUkVET19uX2NvZWYsIGFlcyh5ID0gdmFyaWFibGUsIHg9bWVkaWFuKSkrCiAgZ2VvbV9wb2ludChtYXBwaW5nID0gZ2dwbG90Mjo6YWVzKHkgPSB2YXJpYWJsZSwgc2l6ZSA9bm9uX3plcm8sIGFscGhhID0gbm9uX3plcm8sIGNvbG9yID0gbm9uX3plcm8pKSsKICBzY2FsZV9jb2xvcl9ncmFkaWVudDIoaGlnaCA9ICdncmVlbicsIG1pZCA9ICJwdXJwbGUiLCBsb3cgPSAiYmxhY2siLCBtaWRwb2ludCA9NTAsIGxpbWl0cz1jKDAsMTAwKSkrCiAgc2NhbGVfYWxwaGEoZ3VpZGUgPSAnbm9uZScpKwogIHNjYWxlX3NpemUoZ3VpZGUgPSAnbm9uZScpKwogIGdlb21fcG9pbnQoKSsKICBnZW9tX2Vycm9yYmFyKGFlcyh5ID0gdmFyaWFibGUsIHhtaW4gPSBsY2wsIHhtYXggPSB1Y2wpLCB3aWR0aCA9IDAuMikrCiAgbGFicyh5PSIiLCB4ID0gIlxubWVkaWFuICYgOTUlIENJIG9mIGNvZWZmaWNpZW50IChvdmVyIGJvb3RzdHJhcHMpIiwgY29sb3I9IiUiKSsKICBzY2FsZV94X2NvbnRpbnVvdXMobGltaXRzPWMoLTAuNCwwLjQpLCBicmVha3M9YygtLjQsLS4zLC0uMiwgLS4xLCAwLCAuMSwgLjIsIC4zLCAuNCkpKwogIHNjYWxlX3lfZGlzY3JldGUobGFiZWxzPSBjKCJiaXJ0aCB3ZWlnaHQiLCAiYmlydGggbGVuZ3RoIiwgImhlYWQgY2lyY3VtZmVyZW5jZSIsICJkZWxpdmVyeSBtb2RlIChhaWRlZCkiLCAiaW5kdWNlZCBsYWJvciAoeWVzKSIsICJwYXJpdHkgKGJpcnRoIGJlZm9yZSkiLCAibWF0ZXJuYWwgYWdlIiwgIm1hdGVybmFsIEJNSSIsICJtYXRlcm5hbCBoeXBlcnRlbnNpb24gKHllcykiLCAibWF0ZXJuYWwgZGlhYmV0ZXMgKHllcykiLCAibWF0ZXJuYWwgbWVudGFsIGRpc29yZGVycyAoeWVzKSIsICJtYXRlcm5hbCBzbW9raW5nICh5ZXMpIikpKwogIGdlb21fdmxpbmUoeGludGVyY2VwdD0wLCBsaW5ldHlwZT0iZGFzaGVkIikrCiAgdGhlbWVfYncoKSsKICBnZ3RpdGxlKCJuemVybyA9IDUiKSsKICB0aGVtZSh0ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNyksIGF4aXMudGl0bGUueD0gZWxlbWVudF90ZXh0KHNpemU9MTMpLCBheGlzLnRpdGxlLnk9IGVsZW1lbnRfdGV4dChzaXplPTE1KSwgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplPTE1KSwgYXhpcy50ZXh0Lnk9ZWxlbWVudF9ibGFuaygpKQoKZzEgPC0gZ2dwbG90R3JvYihwMSkKZzIgPC0gZ2dwbG90R3JvYihwMikKZyA8LSBjYmluZChnMSwgZzIsIHNpemUgPSAibGFzdCIpCmckaGVpZ2h0cyA8LSB1bml0LnBtYXgoZzEkaGVpZ2h0cywgZzIkaGVpZ2h0cykKCnBuZyhmaWxlbmFtZT0iUmVzdWx0cy9GaWd1cmVzL2VsYXN0aWNOZXRfc2luZ2xlVGlzc3Vlcy9PdXRjb21lX2FkZC9zZXhfc3BsaXQvTW9kZWxfY29lZl9QbGFjZW50YV9QUkVET19tYWxlLnBuZyIsIHdpZHRoPTU4MDAsIGhlaWdodD0xNjAwLCByZXM9NDAwKQpncmlkLmRyYXcoZykKZGV2Lm9mZigpCmBgYAoKW3RvIHRoZSB0b3BdKCN0b3ApICAgIAogICAgCiMjIyBmZW1hbGVzCmBgYHtyfQojIGluIGNhc2UgeW91IHdhbnQgdG8gc3RhcnQgZnJvbSBoZXJlCmxvYWQoIklucHV0RGF0YS9DbG9ja0NhbGN1bGF0aW9uc0lucHV0L1JlZ19JbnB1dF9EYXRhX1BsYWNlbnRhX2ZlbWFsZV9QUkVET19FQUFSX25vTmFfbi5SZGF0YSIpClJlZ19JbnB1dF9EYXRhX1BsYWNlbnRhX2ZlbWFsZV9QUkVET19FQUFSX25vTmFfbiRDaGlsZF9TZXggPC0gTlVMTApgYGAKCgpgYGB7cn0KeXJjX21hdF9QUkVET19QbGFjZW50YV9mZW1hbGVfbiA8LSBtYXRyaXgoUmVnX0lucHV0X0RhdGFfUGxhY2VudGFfZmVtYWxlX1BSRURPX0VBQVJfbm9OYV9uJEVBQVJfTGVlKQp4cmNfbWF0X1BSRURPX1BsYWNlbnRhX2ZlbWFsZV9uIDwtIG1vZGVsLm1hdHJpeCggfiAuIC0gRUFBUl9MZWUsIGRhdGEgPSBSZWdfSW5wdXRfRGF0YV9QbGFjZW50YV9mZW1hbGVfUFJFRE9fRUFBUl9ub05hX24pWywgLTFdCnlyY19tYXRfUFJFRE9fc2NhbGVkX1BsYWNlbnRhX2ZlbWFsZV9uIDwtIHNjYWxlKHlyY19tYXRfUFJFRE9fUGxhY2VudGFfZmVtYWxlX24pCnhyY19tYXRfUFJFRE9fc2NhbGVkX1BsYWNlbnRhX2ZlbWFsZV9uIDwtIHNjYWxlKHhyY19tYXRfUFJFRE9fUGxhY2VudGFfZmVtYWxlX24pCmBgYAoKPCEtLSBzZXQgc2VlZCAtLT4KPCEtLSBgYGB7cn0gLS0+CjwhLS0gc2V0LnNlZWQoMjAyMCkgLS0+CjwhLS0gYGBgIC0tPgoKCjwhLS0gYGBge3IsIHdhcm5pbmc9Rn0gLS0+CjwhLS0gICBuYm9vdCA9IDEwMDAgLS0+Cgo8IS0tICAgYm9vdHN0cmFwc19QbGFjZW50YV9mZW1hbGVfUFJFRE9fbiA8LSByZXBsaWNhdGUobmJvb3QsIHsgLS0+CjwhLS0gICAgIHJ3cyA8LSBzYW1wbGUoMTpucm93KHhyY19tYXRfUFJFRE9fc2NhbGVkX1BsYWNlbnRhX2ZlbWFsZV9uKSwgcmVwbGFjZSA9IFRSVUUpIC0tPgo8IS0tICAgICBlbnNyKHhyY19tYXRfUFJFRE9fc2NhbGVkX1BsYWNlbnRhX2ZlbWFsZV9uW3J3cywgXSwgeXJjX21hdF9QUkVET19zY2FsZWRfUGxhY2VudGFfZmVtYWxlX25bcndzLCBdLCBzdGFuZGFyZGl6ZWQgPSBGQUxTRSwgZmFtaWx5PSJnYXVzc2lhbiIsIG5sYW1iZGE9MTAwLCBuZm9sZHM9MTAsIGFscGhhPWMoMC4wLDAuMSwwLjIsMC4zLDAuNCwwLjUsMC42LDAuNywwLjgsMC45LDEuMCkpIC0tPgo8IS0tICAgfSwgLS0+CjwhLS0gICBzaW1wbGlmeSA9IEZBTFNFKSAtLT4KPCEtLSBgYGAgLS0+Cgo8IS0tIGBgYHtyfSAtLT4KPCEtLSBzYXZlKGJvb3RzdHJhcHNfUGxhY2VudGFfZmVtYWxlX1BSRURPX24sIGZpbGU9IklucHV0RGF0YS9EYXRhX0VsYXN0aWNOZXRzL2Jvb3RzdHJhcHNfUGxhY2VudGFfZmVtYWxlX1BSRURPX25fMTAwMC5SZGF0YSIpIC0tPgo8IS0tIGBgYCAtLT4KCgpgYGB7cn0KbG9hZCgiSW5wdXREYXRhL0RhdGFfRWxhc3RpY05ldHMvYm9vdHN0cmFwc19QbGFjZW50YV9mZW1hbGVfUFJFRE9fbl8xMDAwLlJkYXRhIikKYGBgCgoKYGBge3J9CnN1bW1hcmllc19QbGFjZW50YV9mZW1hbGVfUFJFRE9fbiA8LQogIGJvb3RzdHJhcHNfUGxhY2VudGFfZmVtYWxlX1BSRURPX24gJT4lCiAgbGFwcGx5KHN1bW1hcnkpICU+JQogIHJiaW5kbGlzdChpZGNvbCA9ICJib290c3RyYXAiKQoKc3VtbWFyaWVzX1BsYWNlbnRhX2ZlbWFsZV9QUkVET19uCmBgYAoKCmBgYHtyfQpzdW1tYXJpZXNfUGxhY2VudGFfZmVtYWxlX1BSRURPX25bLCAuU0RbY3ZtID09IG1pbihjdm0pXSwgYnkgPSBjKCJib290c3RyYXAiLCAibnplcm8iKV0gJT4lCiAgZ2dwbG90Mjo6Z2dwbG90KGRhdGEgPSAuKSArCiAgZ2dwbG90Mjo6YWVzKHggPSBuemVybywgeSA9IGN2bSwgZ3JvdXAgPSBib290c3RyYXApICsKICBnZ3Bsb3QyOjpnZW9tX3BvaW50KCkgKwogIGdncGxvdDI6Omdlb21fbGluZSgpCmBgYAoKCmBgYHtyfQpwbmcoZmlsZW5hbWU9IlJlc3VsdHMvRmlndXJlcy9lbGFzdGljTmV0X3NpbmdsZVRpc3N1ZXMvT3V0Y29tZV9hZGQvc2V4X3NwbGl0L2Jvb3RzdHJhcHNfUGxhY2VudGFfUFJFRE9fZmVtYWxlLnBuZyIsIHdpZHRoPTgwMCwgaGVpZ2h0PTYwMCkKc3VtbWFyaWVzX1BsYWNlbnRhX2ZlbWFsZV9QUkVET19uWywgLlNEW2N2bSA9PSBtaW4oY3ZtKV0sIGJ5ID0gYygiYm9vdHN0cmFwIiwgIm56ZXJvIildICU+JQogIGdncGxvdDI6OmdncGxvdChkYXRhID0gLikgKwogIGdncGxvdDI6OmFlcyh4ID0gbnplcm8sIHkgPSBjdm0sIGdyb3VwID0gYm9vdHN0cmFwKSArCiAgZ2dwbG90Mjo6Z2VvbV9wb2ludCgpICsKICBnZ3Bsb3QyOjpnZW9tX2xpbmUoKQpkZXYub2ZmKCkKYGBgCgoKPCEtLSBgYGB7ciwgd2FybmluZz1GQUxTRX0gLS0+CjwhLS0gIyBsb3dlc3QgY3ZtIGJ5IGJvb3RzdHJhcCBhbmQgbnplcm8gLS0+CjwhLS0gcG1fUGxhY2VudGFfZmVtYWxlX1BSRURPX24gPC0gc3VtbWFyaWVzX1BsYWNlbnRhX2ZlbWFsZV9QUkVET19uWywgLlNEW2N2bSA9PSBtaW4oY3ZtKV0sIGJ5ID0gYygiYm9vdHN0cmFwIiwgIm56ZXJvIildIC0tPgo8IS0tIHBtMl9QbGFjZW50YV9mZW1hbGVfUFJFRE9fbiA8LSBOVUxMIC0tPgoKPCEtLSBmb3IoaSBpbiBhcy5pbnRlZ2VyKHNlcSgxLCBucm93KHBtX1BsYWNlbnRhX2ZlbWFsZV9QUkVET19uKSwgYnkgPSAxKSkpIHsgLS0+CjwhLS0gICBwbTJfUGxhY2VudGFfZmVtYWxlX1BSRURPX24gPC0gcmJpbmQocG0yX1BsYWNlbnRhX2ZlbWFsZV9QUkVET19uLCAtLT4KPCEtLSAgICAgICAgICAgICAgICBjYmluZChwbV9QbGFjZW50YV9mZW1hbGVfUFJFRE9fbltpLCBdLCAtLT4KPCEtLSAgICAgICAgICAgICAgICB0KGFzLm1hdHJpeChjb2VmKGJvb3RzdHJhcHNfUGxhY2VudGFfZmVtYWxlX1BSRURPX25bW3BtX1BsYWNlbnRhX2ZlbWFsZV9QUkVET19uW2ksIGJvb3RzdHJhcF1dXVtbcG1fUGxhY2VudGFfZmVtYWxlX1BSRURPX25baSwgbF9pbmRleF1dXSwgcyA9IHBtX1BsYWNlbnRhX2ZlbWFsZV9QUkVET19uW2ksIGxhbWJkYV0pKSkgLS0+CjwhLS0gICAgICAgICAgICAgICAgKSAtLT4KPCEtLSAgICkgLS0+CjwhLS0gfSAtLT4KCjwhLS0gcG0yX1BsYWNlbnRhX2ZlbWFsZV9QUkVET19uIC0tPgo8IS0tIGBgYCAtLT4KCgo8IS0tIGBgYHtyfSAtLT4KPCEtLSAjIHNhdmUgInByZWZlcmFibGUgbW9kZWxzIiAtLT4KPCEtLSBzYXZlKHBtMl9QbGFjZW50YV9mZW1hbGVfUFJFRE9fbiwgZmlsZT0iSW5wdXREYXRhL0RhdGFfRWxhc3RpY05ldHMvcG0yX1BsYWNlbnRhX2ZlbWFsZV9QUkVET19uLlJkYXRhIikgLS0+CjwhLS0gYGBgIC0tPgoKCmBgYHtyfQpsb2FkKCJJbnB1dERhdGEvRGF0YV9FbGFzdGljTmV0cy9wbTJfUGxhY2VudGFfZmVtYWxlX1BSRURPX24uUmRhdGEiKQojIGNvZWZmaWNpZW50IHZhbHVlcyBmb3IgdGhlIG1vZGVscyB3aXRoIHNtYWxsZXN0IGN2bSBieSBudW1iZXIgb2Ygbm9uLWVyem8gY29lZmZpY2llbnRzIGFuZCBib290c3RyYXAKYGBgCgoKCmBgYHtyfQpjc3VtbWFyeV9QbGFjZW50YV9mZW1hbGVfUFJFRE9fbiA8LSBSZWR1Y2UoZnVuY3Rpb24oeCx5KSBtZXJnZSh4ID0geCwgeSA9IHksIGJ5ID0gIm56ZXJvIiksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3QocG0yX1BsYWNlbnRhX2ZlbWFsZV9QUkVET19uWywgbGFwcGx5KC5TRCwgZnVuY3Rpb24oeCkge21lYW4oeCAhPSAwKX0pLCAuU0Rjb2xzID0gYygiQmlydGhfV2VpZ2h0IiwgIkJpcnRoX0xlbmd0aCIsICJIZWFkX0NpcmN1bWZlcmVuY2VfYXRfQmlydGgiLCAiRGVsaXZlcnlfTW9kZV9kaWNob3RvbWFpZGVkIiwgImluZHVjZWRsYWJvdXJZZXMiLCAiUGFyaXR5X2RpY2hvdG9tZ2l2ZW4gYmlydGggYmVmb3JlIiwgIk1hdGVybmFsX0FnZV8xOFBvcFJlZ2FuZEJSIiwgIk1hdGVybmFsX1ByZXByZWduYW5jeUJNSTE4b2N0MjhuZXciLCAibWF0ZXJuYWxfaHlwZXJ0ZW5zaW9uX2RpY2hvdG9taHlwZXJ0ZW5zaW9uIGluIGN1cnJlbnQgcHJlZ25hbmN5IiwibWF0ZXJuYWxfZGlhYmV0ZXNfZGljaG90b21kaWFiZXRlcyBpbiBjdXJyZW50IHByZWduYW5jeSIsIk1hdGVybmFsX01lbnRhbF9EaXNvcmRlcnNfQnlfQ2hpbGRiaXJ0aFllcyIsInNtb2tpbmdfZGljaG90b215ZXMiKSwgYnkgPSBuemVyb10KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBtMl9QbGFjZW50YV9mZW1hbGVfUFJFRE9fblssIC4obWVhbl9jdm0gPSBtZWFuKGN2bSkpLCBieSA9IG56ZXJvXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBtMl9QbGFjZW50YV9mZW1hbGVfUFJFRE9fblssIC4obWVkaWFuX2N2bSA9IG1lZGlhbihjdm0pKSwgYnkgPSBuemVyb10KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApKVtvcmRlcihuemVybyldCgpjc3VtbWFyeV9QbGFjZW50YV9mZW1hbGVfUFJFRE9fbgpgYGAKCmBgYHtyfQpnMV9QbGFjZW50YV9mZW1hbGVfUFJFRE9fbiA8LQogIGNzdW1tYXJ5X1BsYWNlbnRhX2ZlbWFsZV9QUkVET19uICU+JQogIG1lbHQoaWQudmFycyA9IGMoIm56ZXJvIiwgIm1lYW5fY3ZtIiwgIm1lZGlhbl9jdm0iKSkgJT4lCiAgZ2dwbG90Mjo6Z2dwbG90KC4pICsKICBnZ3Bsb3QyOjp0aGVtZV9idygpICsKICBnZ3Bsb3QyOjphZXMoeCA9IG56ZXJvKSArCiAgZ2dwbG90Mjo6Z2VvbV9wb2ludChtYXBwaW5nID0gZ2dwbG90Mjo6YWVzKHkgPSB2YXJpYWJsZSwgc2l6ZSA9IHZhbHVlLCBhbHBoYSA9IHZhbHVlLCBjb2xvciA9IHZhbHVlKjEwMCkpICsKICBnZ3Bsb3QyOjpzY2FsZV9jb2xvcl9ncmFkaWVudDIoaGlnaCA9ICdncmVlbicsIG1pZCA9ICJwdXJwbGUiLCBsb3cgPSAiYmxhY2siLCBtaWRwb2ludCA9NTApKwogIGdncGxvdDI6OnNjYWxlX2FscGhhKGd1aWRlID0gJ25vbmUnKSsKICBnZ3Bsb3QyOjpzY2FsZV9zaXplKGd1aWRlID0gJ25vbmUnKSsKICBnZ3Bsb3QyOjpzY2FsZV95X2Rpc2NyZXRlKGxhYmVscz0gYygiYmlydGggd2VpZ2h0IiwgImJpcnRoIGxlbmd0aCIsICJoZWFkIGNpcmN1bWZlcmVuY2UiLCAiZGVsaXZlcnkgbW9kZSIsICJpbmR1Y2VkIGxhYm9yIiwgInBhcml0eSIsICJtYXRlcm5hbCBhZ2UiLCAibWF0ZXJuYWwgQk1JIiwgIm1hdGVybmFsIGh5cGVydGVuc2lvbiIsICJtYXRlcm5hbCBkaWFiZXRlcyIsICJtYXRlcm5hbCBtZW50YWwgZGlzb3JkZXJzIiwgIm1hdGVybmFsIHNtb2tpbmciKSkrCiAgZ2dwbG90Mjo6c2NhbGVfeF9jb250aW51b3VzKGJyZWFrcz0wOjE0LCBsYWJlbHM9KSsKICBnZ3Bsb3QyOjpsYWJzKHk9InByZWRpY3RvciIsIHggPSAibnVtYmVyIG9mIG5vbi16ZXJvIGNvZWZmaWNpZW50cyIsIGNvbG9yPSIlIikrCiAgZ2dwbG90Mjo6dGhlbWUodGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTUpLCBheGlzLnRpdGxlLng9IGVsZW1lbnRfdGV4dChzaXplPTE1KSwgYXhpcy50aXRsZS55PSBlbGVtZW50X3RleHQoc2l6ZT0xNSkpCgpnMl9QbGFjZW50YV9mZW1hbGVfUFJFRE9fbiA8LQogIGNzdW1tYXJ5X1BsYWNlbnRhX2ZlbWFsZV9QUkVET19uICU+JQogIGdncGxvdDI6OmdncGxvdCguKSArCiAgZ2dwbG90Mjo6dGhlbWVfYncoKSArCiAgZ2dwbG90Mjo6YWVzKHggPSBuemVybywgeSA9IG1lZGlhbl9jdm0pICsKICBnZ3Bsb3QyOjpnZW9tX3BvaW50KCkgKyBnZ3Bsb3QyOjpnZW9tX2xpbmUoKSsKICBnZ3Bsb3QyOjpsYWJzKHk9Im1lZGlhbiBjdm0iLCB4ID0gIm51bWJlciBvZiBub24temVybyBjb2VmZmljaWVudHMiKSsKICBnZ3Bsb3QyOjpzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzPTA6MTQsIGxhYmVscz0pKwogIGdncGxvdDI6OnRoZW1lKGF4aXMudGV4dD1lbGVtZW50X3RleHQoc2l6ZT0xNSksYXhpcy50aXRsZT1lbGVtZW50X3RleHQoc2l6ZT0xOCkpCgpncmlkRXh0cmE6OmdyaWQuYXJyYW5nZShnMV9QbGFjZW50YV9mZW1hbGVfUFJFRE9fbiwgZzJfUGxhY2VudGFfZmVtYWxlX1BSRURPX24sIG5jb2wgPSAxKQoKYGBgCgoKYGBge3J9CnBuZyhmaWxlbmFtZT0iUmVzdWx0cy9GaWd1cmVzL2VsYXN0aWNOZXRfc2luZ2xlVGlzc3Vlcy9PdXRjb21lX2FkZC9zZXhfc3BsaXQvYm9vdHN0cmFwTW9kZWxzX1BsYWNlbnRhX1BSRURPX2ZlbWFsZS5wbmciLCB3aWR0aD0yNDAwLCBoZWlnaHQ9MTgwMCwgcmVzPTMwMCkKZ3JpZEV4dHJhOjpncmlkLmFycmFuZ2UoZzFfUGxhY2VudGFfZmVtYWxlX1BSRURPX24sIGcyX1BsYWNlbnRhX2ZlbWFsZV9QUkVET19uLCBuY29sID0gMSkKZGV2Lm9mZigpCmBgYAoKYGBge3J9CnBuZyhmaWxlbmFtZT0iUmVzdWx0cy9GaWd1cmVzL2VsYXN0aWNOZXRfc2luZ2xlVGlzc3Vlcy9PdXRjb21lX2FkZC9zZXhfc3BsaXQvTW9kZWxfUGxhY2VudGFfUFJFRE9fZmVtYWxlLnBuZyIsIHdpZHRoPTI4MDAsIGhlaWdodD0xNDAwLCByZXM9NDAwKQpnMV9QbGFjZW50YV9mZW1hbGVfUFJFRE9fbgpkZXYub2ZmKCkKYGBgCgoKYGBge3J9CmVsYm93X2ZpbmRlcihjc3VtbWFyeV9QbGFjZW50YV9mZW1hbGVfUFJFRE9fbiRuemVybywgY3N1bW1hcnlfUGxhY2VudGFfZmVtYWxlX1BSRURPX24kbWVkaWFuX2N2bSkKCm56ZXJvX2luZGljZXNfQ29yZCA8LSBkYXRhLmZyYW1lKHQoZWxib3dfZmluZGVyKGNzdW1tYXJ5X1BsYWNlbnRhX2ZlbWFsZV9QUkVET19uJG56ZXJvLCBjc3VtbWFyeV9QbGFjZW50YV9mZW1hbGVfUFJFRE9fbiRtZWRpYW5fY3ZtKSkpCmNvbG5hbWVzKG56ZXJvX2luZGljZXNfQ29yZCkgPC0gYygieCIsICJ5IikKcm93bmFtZXMobnplcm9faW5kaWNlc19Db3JkKSA8LSBOVUxMCmBgYApgYGB7cn0Kbnplcm9fZmluYWxfcGxhY2VudGFfZmVtYWxlIDwtIDYKYGBgCgoKYGBge3J9CmNzdW1tYXJ5X1BsYWNlbnRhX2ZlbWFsZV9QUkVET19uW256ZXJvICVpbiUgbnplcm9fZmluYWxfcGxhY2VudGFfZmVtYWxlXQpgYGAKCmBgYHtyfQpub256ZXJvX2Nob29zZV9QbGFjZW50YV9mZW1hbGUgPC0gZ2dwbG90Mjo6Z2dwbG90KGNzdW1tYXJ5X1BsYWNlbnRhX2ZlbWFsZV9QUkVET19uKSArCiAgZ2dwbG90Mjo6dGhlbWVfYncoKSsKICBnZ3Bsb3QyOjphZXMoeCA9IG56ZXJvLCB5ID0gbWVkaWFuX2N2bSkgKwogIGdncGxvdDI6OnNjYWxlX3hfY29udGludW91cyhicmVha3M9YygwOjE3KSkrCiAgZ2dwbG90Mjo6Z2VvbV9wb2ludCgpICsgZ2dwbG90Mjo6Z2VvbV9saW5lKCkrCiAgZ2dwbG90Mjo6Z2VvbV9wb2ludChkYXRhPW56ZXJvX2luZGljZXNfQ29yZCwgYWVzKHg9eCwgeT15KSwgY29sb3VyPSJyZWQiLCBzaXplPTIpKwogIGdncGxvdDI6OnlsYWIoIm1lZGlhbiBvZiBtaW5pbXVtIGNyb3NzLXZhbGlkYXRpb24gZXJyb3JzIG92ZXIgYm9vdHN0cmFwcyIpKwogIGdncGxvdDI6OnhsYWIoIm51bWJlciBvZiBub24temVybyBjb2VmZmljaWVudHMiKSsKICBnZ3Bsb3QyOjpnZW9tX3NlZ21lbnQoYWVzKHggPSBuemVyb1sxXSwgeSA9IG1lZGlhbl9jdm1bMV0sIHhlbmQgPSBuemVyb1sxM10sIHllbmQgPSBtZWRpYW5fY3ZtWzEzXSwgY29sb3VyID0gInNlZ21lbnQiKSwgZGF0YSA9IGNzdW1tYXJ5X1BsYWNlbnRhX2ZlbWFsZV9QUkVET19uLCBzaG93LmxlZ2VuZCA9IEYpCgpub256ZXJvX2Nob29zZV9QbGFjZW50YV9mZW1hbGUKYGBgCgpgYGB7cn0KcG5nKGZpbGVuYW1lPSJSZXN1bHRzL0ZpZ3VyZXMvZWxhc3RpY05ldF9zaW5nbGVUaXNzdWVzL091dGNvbWVfYWRkL3NleF9zcGxpdC9uemVyb19jaG9vc2VfUGxhY2VudGFfUFJFRE9fZmVtYWxlLnBuZyIsIHdpZHRoPTE2MDAsIGhlaWdodD0xNDAwLCByZXM9MzAwKQpub256ZXJvX2Nob29zZV9QbGFjZW50YV9mZW1hbGUKZGV2Lm9mZigpCmBgYAoKCgpgYGB7cn0Kc3VtbWFyeV9QbGFjZW50YV9mZW1hbGVfUFJFRE9fbl9maW5hbG56ZXJvIDwtIGNzdW1tYXJ5X1BsYWNlbnRhX2ZlbWFsZV9QUkVET19uW256ZXJvICVpbiUgbnplcm9fZmluYWxfcGxhY2VudGFfZmVtYWxlXQpzaWdfdmFyX25hbWVzX1BsYWNlbnRhX2ZlbWFsZV9QUkVET19uX2ZpbmFsbnplcm8gPC0gRmlsdGVyKGZ1bmN0aW9uKHgpIGFueSh4ID4gMC43NSksIHN1bW1hcnlfUGxhY2VudGFfZmVtYWxlX1BSRURPX25fZmluYWxuemVyb1ssIWMoIm56ZXJvIiwgIm1lYW5fY3ZtIiwgIm1lZGlhbl9jdm0iKV0pICU+JSBjb2xuYW1lcygpCmNvbG5hbWVzKHN1bW1hcnlfUGxhY2VudGFfZmVtYWxlX1BSRURPX25fZmluYWxuemVybykgPC0gYygibm9uLXplcm8iLCAiYmlydGggd2VpZ2h0IiwgImJpcnRoIGxlbmd0aCIsICJoZWFkIGNpcmN1bWZlcmVuY2UiLCAiZGVsaXZlcnkgbW9kZSAoYWlkZWQpIiwgImluZHVjZWQgbGFib3IgKHllcykiLCAicGFyaXR5IChiaXJ0aCBiZWZvcmUpIiwgIm1hdGVybmFsIGFnZSIsICJtYXRlcm5hbCBCTUkiLCAibWF0ZXJuYWwgaHlwZXJ0ZW5zaW9uICh5ZXMpIiwgIm1hdGVybmFsIGRpYWJldGVzICh5ZXMpIiwgIm1hdGVybmFsIG1lbnRhbCBkaXNvcmRlcnMgKHllcykiLCAibWF0ZXJuYWwgc21va2luZyAoeWVzKSIsICJtZWFuIGN2bSIsICJtZWRpYW4gY3ZtIikKc3VtbWFyeV9QbGFjZW50YV9mZW1hbGVfUFJFRE9fbl9maW5hbG56ZXJvVCA8LSBhcy5kYXRhLmZyYW1lKHQoc3VtbWFyeV9QbGFjZW50YV9mZW1hbGVfUFJFRE9fbl9maW5hbG56ZXJvWywtYygibm9uLXplcm8iLCAibWVkaWFuIGN2bSIsICJtZWFuIGN2bSIpXSkpCnN1bW1hcnlfUGxhY2VudGFfZmVtYWxlX1BSRURPX25fZmluYWxuemVyb1QkdmFyaWFibGUgPC0gcm93bmFtZXMoc3VtbWFyeV9QbGFjZW50YV9mZW1hbGVfUFJFRE9fbl9maW5hbG56ZXJvVCkKcm93bmFtZXMoc3VtbWFyeV9QbGFjZW50YV9mZW1hbGVfUFJFRE9fbl9maW5hbG56ZXJvVCkgPC0gTlVMTApuYW1lcyhzdW1tYXJ5X1BsYWNlbnRhX2ZlbWFsZV9QUkVET19uX2ZpbmFsbnplcm9UKVtuYW1lcyhzdW1tYXJ5X1BsYWNlbnRhX2ZlbWFsZV9QUkVET19uX2ZpbmFsbnplcm9UKSA9PSAnVjEnXSA8LSAncGVyY2VudCcKc3VtbWFyeV9QbGFjZW50YV9mZW1hbGVfUFJFRE9fbl9maW5hbG56ZXJvVCA8LSBzdW1tYXJ5X1BsYWNlbnRhX2ZlbWFsZV9QUkVET19uX2ZpbmFsbnplcm9UW29yZGVyKHN1bW1hcnlfUGxhY2VudGFfZmVtYWxlX1BSRURPX25fZmluYWxuemVyb1QkcGVyY2VudCksXQoKc3VtbWFyeV9QbGFjZW50YV9mZW1hbGVfUFJFRE9fbl9maW5hbG56ZXJvVCRudW1iZXIgPC0gc2VxKDEsIGxlbmd0aChzdW1tYXJ5X1BsYWNlbnRhX2ZlbWFsZV9QUkVET19uX2ZpbmFsbnplcm9UJHZhcmlhYmxlKSkKYGBgCgpgYGB7ciwgZmlnLndpZHRoPTh9CnBlcmNfdmFyc19QbGFjZW50YV9mZW1hbGVfUFJFRE9fbiA8LSAKICBnZ3Bsb3Qoc3VtbWFyeV9QbGFjZW50YV9mZW1hbGVfUFJFRE9fbl9maW5hbG56ZXJvVCwgYWVzKHJlb3JkZXIodmFyaWFibGUsIHBlcmNlbnQpLCBwZXJjZW50LCBncm91cD0xKSkrCiAgZ2VvbV9wb2ludCgpKyBnZW9tX2xpbmUoKSsKICB5bGFiKCIlIG9jY3VyZW5jZSBpbiBtb2RlbHMgd2l0aCBuemVybyBjb2VmZmljaWVudHMgPSA0IikrCiAgc2NhbGVfeV9jb250aW51b3VzKGJyZWFrcz1jKDAuMSwwLjIsMC4zLDAuNCwwLjUsMC42LDAuNywwLjgsMC45KSkrCiAgeGxhYigidmFyaWFibGUiKSsKICBjb29yZF9mbGlwKCkrCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0PTAuNzUsIGxpbmV0eXBlPSJkb3R0ZWQiKSsKICB0aGVtZV9idygpCgpwZXJjX3ZhcnNfUGxhY2VudGFfZmVtYWxlX1BSRURPX24KCiMgZGVjaWRlIGZvciBjdXQtb2ZmICUgLT4gaGVyZSAuNzUKCkZpbHRlcihmdW5jdGlvbih4KSBhbnkoeCA+IDAuNzUpLCBzdW1tYXJ5X1BsYWNlbnRhX2ZlbWFsZV9QUkVET19uX2ZpbmFsbnplcm9bLCFjKCJub24temVybyIsICJtZWFuIGN2bSIsICJtZWRpYW4gY3ZtIildKQoKYGBgCgoKYGBge3J9CnBuZyhmaWxlbmFtZT0iUmVzdWx0cy9GaWd1cmVzL2VsYXN0aWNOZXRfc2luZ2xlVGlzc3Vlcy9PdXRjb21lX2FkZC9zZXhfc3BsaXQvdmFyc1BlcmNlbnRfUGxhY2VudGFfZmVtYWxlLnBuZyIsIHdpZHRoPTExMDAsIGhlaWdodD0xNDAwLCByZXM9MzAwKQpwZXJjX3ZhcnNfUGxhY2VudGFfZmVtYWxlX1BSRURPX24KZGV2Lm9mZigpCmBgYAoKCiAgCmBgYHtyfQpwbTJfUGxhY2VudGFfZmVtYWxlX1BSRURPX25fY29lZiA8LQogIGRjYXN0KHBtMl9QbGFjZW50YV9mZW1hbGVfUFJFRE9fblssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcy5saXN0KHVubGlzdCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwcGx5KC5TRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uKHgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeSA8LSB1bm5hbWUocXVhbnRpbGUoeFt4ICE9IDBdLCBwcm9icyA9IGMoMC4wMjUsIDAuOTc1KSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3QoIm5vbl96ZXJvIiA9IDEwMCAqIG1lYW4oeCAhPSAwKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsY2wgPSB5WzFdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVjbCA9IHlbMl0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGggPSBkaWZmKHkpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhbiA9IG1lZGlhbih4W3ghPSAwXSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSkpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLlNEY29scyA9IGMoIkJpcnRoX1dlaWdodCIsICJCaXJ0aF9MZW5ndGgiLCAiSGVhZF9DaXJjdW1mZXJlbmNlX2F0X0JpcnRoIiwgIkRlbGl2ZXJ5X01vZGVfZGljaG90b21haWRlZCIsICJpbmR1Y2VkbGFib3VyWWVzIiwgIlBhcml0eV9kaWNob3RvbWdpdmVuIGJpcnRoIGJlZm9yZSIsICJNYXRlcm5hbF9BZ2VfMThQb3BSZWdhbmRCUiIsICJNYXRlcm5hbF9QcmVwcmVnbmFuY3lCTUkxOG9jdDI4bmV3IiwgIm1hdGVybmFsX2h5cGVydGVuc2lvbl9kaWNob3RvbWh5cGVydGVuc2lvbiBpbiBjdXJyZW50IHByZWduYW5jeSIsIm1hdGVybmFsX2RpYWJldGVzX2RpY2hvdG9tZGlhYmV0ZXMgaW4gY3VycmVudCBwcmVnbmFuY3kiLCJNYXRlcm5hbF9NZW50YWxfRGlzb3JkZXJzX0J5X0NoaWxkYmlydGhZZXMiLCJzbW9raW5nX2RpY2hvdG9teWVzIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieSA9IG56ZXJvXVtvcmRlcihuemVybyldICU+JQogICAgICAgICAgbWVsdChpZC52YXIgPSAibnplcm8iKSAlPiUKICAgICAgICAgIC5bLCBtZXRyaWMgOj0gc3ViKCJeLitcXC4oLispJCIsICJcXDEiLCB2YXJpYWJsZSldICU+JQogICAgICAgICAgLlssIHZhcmlhYmxlIDo9IHN1YigiXiguKylcXC4uKyQiLCAiXFwxIiwgdmFyaWFibGUpXSAlPiUKICAgICAgICAgIC5bbnplcm8gPT1uemVyb19maW5hbF9wbGFjZW50YV9mZW1hbGVdLCBuemVybysgdmFyaWFibGUgfiBtZXRyaWMsIHZhbHVlLnZhcj0idmFsdWUiKQoKIyBnZXQgZGVzaXJlZCBvcmRlciBvZiBwcmVkaWN0b3JzCnBtMl9QbGFjZW50YV9mZW1hbGVfUFJFRE9fbl9jb2VmIDwtCiAgcG0yX1BsYWNlbnRhX2ZlbWFsZV9QUkVET19uX2NvZWZbbWF0Y2goYygiQmlydGhfV2VpZ2h0IiwgIkJpcnRoX0xlbmd0aCIsICJIZWFkX0NpcmN1bWZlcmVuY2VfYXRfQmlydGgiLCAiRGVsaXZlcnlfTW9kZV9kaWNob3RvbWFpZGVkIiwgImluZHVjZWRsYWJvdXJZZXMiLCAiUGFyaXR5X2RpY2hvdG9tZ2l2ZW4gYmlydGggYmVmb3JlIiwgIk1hdGVybmFsX0FnZV8xOFBvcFJlZ2FuZEJSIiwgIk1hdGVybmFsX1ByZXByZWduYW5jeUJNSTE4b2N0MjhuZXciLCAibWF0ZXJuYWxfaHlwZXJ0ZW5zaW9uX2RpY2hvdG9taHlwZXJ0ZW5zaW9uIGluIGN1cnJlbnQgcHJlZ25hbmN5IiwibWF0ZXJuYWxfZGlhYmV0ZXNfZGljaG90b21kaWFiZXRlcyBpbiBjdXJyZW50IHByZWduYW5jeSIsIk1hdGVybmFsX01lbnRhbF9EaXNvcmRlcnNfQnlfQ2hpbGRiaXJ0aFllcyIsInNtb2tpbmdfZGljaG90b215ZXMiKSwgcG0yX1BsYWNlbnRhX2ZlbWFsZV9QUkVET19uX2NvZWYkdmFyaWFibGUpLF0KcG0yX1BsYWNlbnRhX2ZlbWFsZV9QUkVET19uX2NvZWYkdmFyaWFibGUgPC0gZmFjdG9yKHBtMl9QbGFjZW50YV9mZW1hbGVfUFJFRE9fbl9jb2VmJHZhcmlhYmwsIGxldmVscz11bmlxdWUocG0yX1BsYWNlbnRhX2ZlbWFsZV9QUkVET19uX2NvZWYkdmFyaWFibGUpKQoKIyMgTk9URTogbWVkaWFuIGlzIHVzZWQgaGVyZSBpbnN0ZWFkIG9mIG1lYW4KIyBtYWtlIGZyYW1lIGZvciBvbmx5IHNpZ25pZmljYW50IHZhcmlhYmxlczoKcG0yX1BsYWNlbnRhX2ZlbWFsZV9QUkVET19uX2RhdGFibGUgPC0gZGNhc3QocG0yX1BsYWNlbnRhX2ZlbWFsZV9QUkVET19uWywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXMubGlzdCh1bmxpc3QoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwcGx5KC5TRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24oeCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHkgPC0gdW5uYW1lKHF1YW50aWxlKHhbeCAhPSAwXSwgcHJvYnMgPSBjKDAuMDI1LCAwLjk3NSkpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3QoIm5vbl96ZXJvIiA9IDEwMCAqIG1lYW4oeCAhPSAwKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxjbCA9IHlbMV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1Y2wgPSB5WzJdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGggPSBkaWZmKHkpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFuID0gbWVkaWFuKHhbeCE9IDBdKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLlNEY29scyA9IGMoIkJpcnRoX1dlaWdodCIsICJCaXJ0aF9MZW5ndGgiLCAiSGVhZF9DaXJjdW1mZXJlbmNlX2F0X0JpcnRoIiwgIkRlbGl2ZXJ5X01vZGVfZGljaG90b21haWRlZCIsICJpbmR1Y2VkbGFib3VyWWVzIiwgIlBhcml0eV9kaWNob3RvbWdpdmVuIGJpcnRoIGJlZm9yZSIsICJNYXRlcm5hbF9BZ2VfMThQb3BSZWdhbmRCUiIsICJNYXRlcm5hbF9QcmVwcmVnbmFuY3lCTUkxOG9jdDI4bmV3IiwgIm1hdGVybmFsX2h5cGVydGVuc2lvbl9kaWNob3RvbWh5cGVydGVuc2lvbiBpbiBjdXJyZW50IHByZWduYW5jeSIsIm1hdGVybmFsX2RpYWJldGVzX2RpY2hvdG9tZGlhYmV0ZXMgaW4gY3VycmVudCBwcmVnbmFuY3kiLCJNYXRlcm5hbF9NZW50YWxfRGlzb3JkZXJzX0J5X0NoaWxkYmlydGhZZXMiLCJzbW9raW5nX2RpY2hvdG9teWVzIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5ID0gbnplcm9dW29yZGVyKG56ZXJvKV0gJT4lCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbHQoaWQudmFyID0gIm56ZXJvIikgJT4lCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5bLCBtZXRyaWMgOj0gc3ViKCJeLitcXC4oLispJCIsICJcXDEiLCB2YXJpYWJsZSldICU+JQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuWywgdmFyaWFibGUgOj0gc3ViKCJeKC4rKVxcLi4rJCIsICJcXDEiLCB2YXJpYWJsZSldICU+JQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHByaW50ICU+JQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuW256ZXJvID09IG56ZXJvX2ZpbmFsX3BsYWNlbnRhX2ZlbWFsZSAmIHZhcmlhYmxlICVpbiUgc2lnX3Zhcl9uYW1lc19QbGFjZW50YV9mZW1hbGVfUFJFRE9fbl9maW5hbG56ZXJvXSwgbnplcm8rIHZhcmlhYmxlIH4gbWV0cmljLCB2YWx1ZS52YXI9InZhbHVlIikKCnBtMl9QbGFjZW50YV9mZW1hbGVfUFJFRE9fbl9kYXRhYmxlCmBgYAoKCmBgYHtyfQpzaWdfdmFyc19QbGFjZW50YV9mZW1hbGVfUFJFRE9fbiA8LQogIHBtMl9QbGFjZW50YV9mZW1hbGVfUFJFRE9fbl9jb2VmICU+JQogIGdncGxvdDI6OmdncGxvdCguKSArCiAgZ2dwbG90Mjo6dGhlbWVfYncoKSArCiAgZ2dwbG90Mjo6dGhlbWUoYXhpcy50ZXh0Lng9ZWxlbWVudF9ibGFuaygpKSsKICBnZ3Bsb3QyOjphZXMoeD0ibnplcm8iKSsKICBnZ3Bsb3QyOjpnZW9tX3BvaW50KG1hcHBpbmcgPSBnZ3Bsb3QyOjphZXMoeSA9IHZhcmlhYmxlLCBzaXplID1ub25femVybywgYWxwaGEgPSBub25femVybywgY29sb3IgPSBub25femVybykpICsKICBnZ3Bsb3QyOjpnZW9tX3RleHQoYWVzKHk9dmFyaWFibGUsIGxhYmVsPXNwcmludGYoIiUwLjJmIiwgcm91bmQobWVkaWFuLCBkaWdpdHM9MikpLCBzaXplPTUwKSxoanVzdD0wLCB2anVzdD0wLjUsIG51ZGdlX3ggPSAwLjEpKwogIGdncGxvdDI6OnNjYWxlX2NvbG9yX2dyYWRpZW50MihoaWdoID0gJ2dyZWVuJywgbWlkID0gInB1cnBsZSIsIGxvdyA9ICJibGFjayIsIG1pZHBvaW50ID01MCkrCiAgZ2dwbG90Mjo6c2NhbGVfYWxwaGEoZ3VpZGUgPSAnbm9uZScpKwogIGdncGxvdDI6OnNjYWxlX3NpemUoZ3VpZGUgPSAnbm9uZScpKwogIGdncGxvdDI6OnNjYWxlX3lfZGlzY3JldGUobGFiZWxzPSBjKCJiaXJ0aCB3ZWlnaHQiLCAiYmlydGggbGVuZ3RoIiwgImhlYWQgY2lyY3VtZmVyZW5jZSIsICJkZWxpdmVyeSBtb2RlIChhaWRlZCkiLCAiaW5kdWNlZCBsYWJvciAoeWVzKSIsICJwYXJpdHkgKGJpcnRoIGJlZm9yZSkiLCAibWF0ZXJuYWwgYWdlIiwgIm1hdGVybmFsIEJNSSIsICJtYXRlcm5hbCBoeXBlcnRlbnNpb24gKHllcykiLCAibWF0ZXJuYWwgZGlhYmV0ZXMgKHllcykiLCAibWF0ZXJuYWwgbWVudGFsIGRpc29yZGVycyAoeWVzKSIsICJtYXRlcm5hbCBzbW9raW5nICh5ZXMpIikpKwogIGdncGxvdDI6OmxhYnMoeT0icHJlZGljdG9yIiwgeCA9ICJudW1iZXIgb2Ygbm9uLXplcm8gY29lZmZpY2llbnRzID0gNiIsIGNvbG9yPSIlIikKYGBgCgpgYGB7cn0KY29lZl9QbGFjZW50YV9mZW1hbGVfUFJFRE9fbiA8LSAKICBnZ3Bsb3QocG0yX1BsYWNlbnRhX2ZlbWFsZV9QUkVET19uX2NvZWYsIGFlcyh5ID0gdmFyaWFibGUsIHg9bWVkaWFuKSkrCiAgZ2VvbV9wb2ludChtYXBwaW5nID0gZ2dwbG90Mjo6YWVzKHkgPSB2YXJpYWJsZSwgc2l6ZSA9bm9uX3plcm8sIGFscGhhID0gbm9uX3plcm8sIGNvbG9yID0gbm9uX3plcm8pKSsKICBzY2FsZV9jb2xvcl9ncmFkaWVudDIoaGlnaCA9ICdncmVlbicsIG1pZCA9ICJwdXJwbGUiLCBsb3cgPSAiYmxhY2siLCBtaWRwb2ludCA9NTAsIGxpbWl0cz1jKDAsMTAwKSkrCiAgc2NhbGVfYWxwaGEoZ3VpZGUgPSAnbm9uZScpKwogIHNjYWxlX3NpemUoZ3VpZGUgPSAnbm9uZScpKwogIGdlb21fcG9pbnQoKSsKICBnZW9tX2Vycm9yYmFyKGFlcyh5ID0gdmFyaWFibGUsIHhtaW4gPSBsY2wsIHhtYXggPSB1Y2wpLCB3aWR0aCA9IDAuMikrCiAgbGFicyh5PSJwcmVkaWN0b3IiLCB4ID0gIlxubWVkaWFuICYgOTUlIENJIG9mIGNvZWZmaWNpZW50IChvdmVyIGJvb3RzdHJhcHMpIiwgY29sb3I9IiUiKSsKICBzY2FsZV94X2NvbnRpbnVvdXMobGltaXRzPWMoLTAuNSwwLjQpLCBicmVha3M9YygtLjQsLS4zLC0uMiwgLS4xLCAwLCAuMSwgLjIsIC4zLCAuNCkpKwogIHNjYWxlX3lfZGlzY3JldGUobGFiZWxzPSBjKCJiaXJ0aCB3ZWlnaHQiLCAiYmlydGggbGVuZ3RoIiwgImhlYWQgY2lyY3VtZmVyZW5jZSIsICJkZWxpdmVyeSBtb2RlIChhaWRlZCkiLCAiaW5kdWNlZCBsYWJvciAoeWVzKSIsICJwYXJpdHkgKGJpcnRoIGJlZm9yZSkiLCAibWF0ZXJuYWwgYWdlIiwgIm1hdGVybmFsIEJNSSIsICJtYXRlcm5hbCBoeXBlcnRlbnNpb24gKHllcykiLCAibWF0ZXJuYWwgZGlhYmV0ZXMgKHllcykiLCAibWF0ZXJuYWwgbWVudGFsIGRpc29yZGVycyAoeWVzKSIsICJtYXRlcm5hbCBzbW9raW5nICh5ZXMpIikpKwogIGdlb21fdmxpbmUoeGludGVyY2VwdD0wLCBsaW5ldHlwZT0iZGFzaGVkIikrCiAgdGhlbWVfYncoKSsKICB0aGVtZSh0ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNSksIGF4aXMudGl0bGUueD0gZWxlbWVudF90ZXh0KHNpemU9MTUpLCBheGlzLnRpdGxlLnk9IGVsZW1lbnRfdGV4dChzaXplPTE1KSkKCgpjb2VmX1BsYWNlbnRhX2ZlbWFsZV9QUkVET19uCmBgYAoKCmBgYHtyfQpwbmcoZmlsZW5hbWU9IlJlc3VsdHMvRmlndXJlcy9lbGFzdGljTmV0X3NpbmdsZVRpc3N1ZXMvT3V0Y29tZV9hZGQvc2V4X3NwbGl0L2NvZWZfUGxhY2VudGFfUFJFRE9fZmVtYWxlLnBuZyIsIHdpZHRoPTI4MDAsIGhlaWdodD0xNDAwLCByZXM9NDAwKQpjb2VmX1BsYWNlbnRhX2ZlbWFsZV9QUkVET19uCmRldi5vZmYoKQpgYGAKCmBgYHtyfQpwMSA8LQogIGNzdW1tYXJ5X1BsYWNlbnRhX2ZlbWFsZV9QUkVET19uICU+JQogIG1lbHQoaWQudmFycyA9IGMoIm56ZXJvIiwgIm1lYW5fY3ZtIiwgIm1lZGlhbl9jdm0iKSkgJT4lCiAgZ2dwbG90Mjo6Z2dwbG90KC4pICsKICBnZ3Bsb3QyOjp0aGVtZV9idygpICsKICBnZ3Bsb3QyOjphZXMoeCA9IG56ZXJvKSArCiAgZ2dwbG90Mjo6Z2VvbV9wb2ludChtYXBwaW5nID0gZ2dwbG90Mjo6YWVzKHkgPSB2YXJpYWJsZSwgc2l6ZSA9IHZhbHVlLCBhbHBoYSA9IHZhbHVlLCBjb2xvciA9IHZhbHVlKjEwMCkpICsKICBnZ3Bsb3QyOjpzY2FsZV9jb2xvcl9ncmFkaWVudDIoaGlnaCA9ICdncmVlbicsIG1pZCA9ICJwdXJwbGUiLCBsb3cgPSAiYmxhY2siLCBtaWRwb2ludCA9NTApKwogIGdncGxvdDI6OnNjYWxlX2FscGhhKGd1aWRlID0gJ25vbmUnKSsKICBnZ3Bsb3QyOjpzY2FsZV9zaXplKGd1aWRlID0gJ25vbmUnKSsKICBnZ3Bsb3QyOjpzY2FsZV95X2Rpc2NyZXRlKGxhYmVscz0gYygiYmlydGggd2VpZ2h0IiwgImJpcnRoIGxlbmd0aCIsICJoZWFkIGNpcmN1bWZlcmVuY2UiLCAiZGVsaXZlcnkgbW9kZSAoYWlkZWQpIiwgImluZHVjZWQgbGFib3IgKHllcykiLCAicGFyaXR5IChiaXJ0aCBiZWZvcmUpIiwgIm1hdGVybmFsIGFnZSIsICJtYXRlcm5hbCBCTUkiLCAibWF0ZXJuYWwgaHlwZXJ0ZW5zaW9uICh5ZXMpIiwgIm1hdGVybmFsIGRpYWJldGVzICh5ZXMpIiwgIm1hdGVybmFsIG1lbnRhbCBkaXNvcmRlcnMgKHllcykiLCAibWF0ZXJuYWwgc21va2luZyAoeWVzKSIpKSsKICBnZ3Bsb3QyOjpzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzPTA6MTQsIGxhYmVscz0pKwogIGdncGxvdDI6OmxhYnMoeT0icHJlZGljdG9yIiwgeCA9ICJcbm51bWJlciBvZiBub24temVybyBjb2VmZmljaWVudHMiLCBjb2xvcj0iJSIpKwogIGdncGxvdDI6OnRoZW1lKHRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE3KSwgYXhpcy50aXRsZS54PSBlbGVtZW50X3RleHQoc2l6ZT0xNSksIGF4aXMudGl0bGUueT0gZWxlbWVudF90ZXh0KHNpemU9MTUpLCBsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpCiAgCnAyIDwtIApjb2VmX1BsYWNlbnRhX21hbGVfUFJFRE9fbiA8LSAKICBnZ3Bsb3QocG0yX1BsYWNlbnRhX2ZlbWFsZV9QUkVET19uX2NvZWYsIGFlcyh5ID0gdmFyaWFibGUsIHg9bWVkaWFuKSkrCiAgZ2VvbV9wb2ludChtYXBwaW5nID0gZ2dwbG90Mjo6YWVzKHkgPSB2YXJpYWJsZSwgc2l6ZSA9bm9uX3plcm8sIGFscGhhID0gbm9uX3plcm8sIGNvbG9yID0gbm9uX3plcm8pKSsKICBzY2FsZV9jb2xvcl9ncmFkaWVudDIoaGlnaCA9ICdncmVlbicsIG1pZCA9ICJwdXJwbGUiLCBsb3cgPSAiYmxhY2siLCBtaWRwb2ludCA9NTAsIGxpbWl0cz1jKDAsMTAwKSkrCiAgc2NhbGVfYWxwaGEoZ3VpZGUgPSAnbm9uZScpKwogIHNjYWxlX3NpemUoZ3VpZGUgPSAnbm9uZScpKwogIGdlb21fcG9pbnQoKSsKICBnZW9tX2Vycm9yYmFyKGFlcyh5ID0gdmFyaWFibGUsIHhtaW4gPSBsY2wsIHhtYXggPSB1Y2wpLCB3aWR0aCA9IDAuMikrCiAgbGFicyh5PSIiLCB4ID0gIlxubWVkaWFuICYgOTUlIENJIG9mIGNvZWZmaWNpZW50IChvdmVyIGJvb3RzdHJhcHMpIiwgY29sb3I9IiUiKSsKICBzY2FsZV94X2NvbnRpbnVvdXMobGltaXRzPWMoLTAuNSwwLjQpLCBicmVha3M9YygtLjQsLS4zLC0uMiwgLS4xLCAwLCAuMSwgLjIsIC4zLCAuNCkpKwogIHNjYWxlX3lfZGlzY3JldGUobGFiZWxzPSBjKCJiaXJ0aCB3ZWlnaHQiLCAiYmlydGggbGVuZ3RoIiwgImhlYWQgY2lyY3VtZmVyZW5jZSIsICJkZWxpdmVyeSBtb2RlIChhaWRlZCkiLCAiaW5kdWNlZCBsYWJvciAoeWVzKSIsICJwYXJpdHkgKGJpcnRoIGJlZm9yZSkiLCAibWF0ZXJuYWwgYWdlIiwgIm1hdGVybmFsIEJNSSIsICJtYXRlcm5hbCBoeXBlcnRlbnNpb24gKHllcykiLCAibWF0ZXJuYWwgZGlhYmV0ZXMgKHllcykiLCAibWF0ZXJuYWwgbWVudGFsIGRpc29yZGVycyAoeWVzKSIsICJtYXRlcm5hbCBzbW9raW5nICh5ZXMpIikpKwogIGdlb21fdmxpbmUoeGludGVyY2VwdD0wLCBsaW5ldHlwZT0iZGFzaGVkIikrCiAgdGhlbWVfYncoKSsKICBnZ3RpdGxlKCJuemVybyA9IDYiKSsKICB0aGVtZSh0ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNyksIGF4aXMudGl0bGUueD0gZWxlbWVudF90ZXh0KHNpemU9MTUpLCBheGlzLnRpdGxlLnk9IGVsZW1lbnRfdGV4dChzaXplPTE1KSwgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplPTE1KSwgYXhpcy50ZXh0Lnk9ZWxlbWVudF9ibGFuaygpKQoKZzEgPC0gZ2dwbG90R3JvYihwMSkKZzIgPC0gZ2dwbG90R3JvYihwMikKZyA8LSBjYmluZChnMSwgZzIsIHNpemUgPSAibGFzdCIpCmckaGVpZ2h0cyA8LSB1bml0LnBtYXgoZzEkaGVpZ2h0cywgZzIkaGVpZ2h0cykKCnBuZyhmaWxlbmFtZT0iUmVzdWx0cy9GaWd1cmVzL2VsYXN0aWNOZXRfc2luZ2xlVGlzc3Vlcy9PdXRjb21lX2FkZC9zZXhfc3BsaXQvTW9kZWxfY29lZl9QbGFjZW50YV9QUkVET19mZW1hbGUucG5nIiwgd2lkdGg9NTgwMCwgaGVpZ2h0PTE2MDAsIHJlcz00MDApCmdyaWQuZHJhdyhnKQpkZXYub2ZmKCkKYGBgCgpbdG8gdGhlIHRvcF0oI3RvcCkgICAgCgojIyBQcmVkaWN0aW9uIGluIFBSRURPIGNvcmQgYmxvb2QgeyNwcmVkaWN0aW9uQ29yZFBSRURPfSAgCmBgYHtyfQppZmVsc2UoIWRpci5leGlzdHMoZmlsZS5wYXRoKGdldHdkKCksICJSZXN1bHRzL0ZpZ3VyZXMvcHJlZFBSRURPIikpLCBkaXIuY3JlYXRlKGZpbGUucGF0aChnZXR3ZCgpLCAiUmVzdWx0cy9GaWd1cmVzL3ByZWRQUkVETyIpKSwgRkFMU0UpCmBgYAoKbG9hZCBQUkVETyBkYXRhIEVQSUMKYGBge3J9CmxvYWQoIklucHV0RGF0YS9DbG9ja0NhbGN1bGF0aW9uc0lucHV0L1JlZ19JbnB1dF9EYXRhX0NvcmRibG9vZF9QUkVET19FQUFSX25vTmFfbi5SZGF0YSIpCmBgYAoKbG9hZCBQUkVETyBkYXRhIDQ1MEsKYGBge3J9CmxvYWQoIklucHV0RGF0YS9DbG9ja0NhbGN1bGF0aW9uc0lucHV0L1JlZ19JbnB1dF9EYXRhX0NvcmRibG9vZF9QUkVETzQ1MEtfRUFBUl9ub05hX24uUmRhdGEiKQpgYGAKCmxvYWQgYmV0YSB2YWx1ZXMgZnJvbSBJVFUKYGBge3J9CmxvYWQoIklucHV0RGF0YS9EYXRhX0VsYXN0aWNOZXRzL0JldGFfQ29yZF9JVFVfbi5SZGF0YSIpCkJldGFfQ29yZF9JVFVfbgpgYGAKCnByZXBhcmUgUFJFRE8gZGF0YSBFUElDCmBgYHtyfQp5X21hdF9QUkVET19Db3JkX3ByZWQgPC0gbWF0cml4KFJlZ19JbnB1dF9EYXRhX0NvcmRibG9vZF9QUkVET19FQUFSX25vTmFfbiRFQUFSX0JvaGxpbikKClJlZ19JbnB1dF9EYXRhX0NvcmRibG9vZF9QUkVET19FQUFSX25vTmFfdmFycyA8LSBSZWdfSW5wdXRfRGF0YV9Db3JkYmxvb2RfUFJFRE9fRUFBUl9ub05hX25bICxjKCJDaGlsZF9TZXgiLCAiQmlydGhfTGVuZ3RoIiwgIkRlbGl2ZXJ5X01vZGVfZGljaG90b20iLCAiTWF0ZXJuYWxfTWVudGFsX0Rpc29yZGVyc19CeV9DaGlsZGJpcnRoIiwgInNtb2tpbmdfZGljaG90b20iKV0KCnhfbWF0X1BSRURPX0NvcmRfcHJlZCA8LSBtb2RlbC5tYXRyaXgofiAuLCBkYXRhPSBSZWdfSW5wdXRfRGF0YV9Db3JkYmxvb2RfUFJFRE9fRUFBUl9ub05hX3ZhcnMpWywgLTFdCgp5X21hdF9QUkVET19zY2FsZWRfQ29yZF9wcmVkIDwtIHNjYWxlKHlfbWF0X1BSRURPX0NvcmRfcHJlZCkKCnhfbWF0X1BSRURPX3NjYWxlZF9Db3JkX3ByZWQgPC0gc2NhbGUoeF9tYXRfUFJFRE9fQ29yZF9wcmVkKQp4X21hdF9QUkVET19zY2FsZWRfQ29yZF9wcmVkIDwtIGNiaW5kKDEsIHhfbWF0X1BSRURPX3NjYWxlZF9Db3JkX3ByZWQpCmNvbG5hbWVzKHhfbWF0X1BSRURPX3NjYWxlZF9Db3JkX3ByZWQpIDwtIGMoIkludGVyY2VwdCIsICJjaGlsZCBzZXgiLCAiYmlydGggbGVuZ3RoIiwgImRlbGl2ZXJ5IG1vZGUiLCAibWF0ZXJuYWwgbWVudGFsIGRpc29yZGVycyIsICJtYXRlcm5hbCBzbW9raW5nIikKYGBgCgpwcmVwYXJlIFBSRURPIGRhdGEgNDUwSwpgYGB7cn0KeV9tYXRfUFJFRE9fQ29yZF9wcmVkSyA8LSBtYXRyaXgoUmVnX0lucHV0X0RhdGFfQ29yZGJsb29kX1BSRURPNDUwS19FQUFSX25vTmFfbiRFQUFSX0JvaGxpbikKClJlZ19JbnB1dF9EYXRhX0NvcmRibG9vZF9QUkVET19FQUFSX25vTmFfdmFyc0sgPC0gUmVnX0lucHV0X0RhdGFfQ29yZGJsb29kX1BSRURPNDUwS19FQUFSX25vTmFfblsgLGMoIkNoaWxkX1NleCIsICJCaXJ0aF9MZW5ndGgiLCAiRGVsaXZlcnlfTW9kZV9kaWNob3RvbSIsICAiTWF0ZXJuYWxfTWVudGFsX0Rpc29yZGVyc19CeV9DaGlsZGJpcnRoIiwgInNtb2tpbmdfZGljaG90b20iKV0KCnhfbWF0X1BSRURPX0NvcmRfcHJlZEsgPC0gbW9kZWwubWF0cml4KH4gLiwgZGF0YT0gUmVnX0lucHV0X0RhdGFfQ29yZGJsb29kX1BSRURPX0VBQVJfbm9OYV92YXJzSylbLCAtMV0KCnlfbWF0X1BSRURPX3NjYWxlZF9Db3JkX3ByZWRLIDwtIHNjYWxlKHlfbWF0X1BSRURPX0NvcmRfcHJlZEspCgp4X21hdF9QUkVET19zY2FsZWRfQ29yZF9wcmVkSyA8LSBzY2FsZSh4X21hdF9QUkVET19Db3JkX3ByZWRLKQp4X21hdF9QUkVET19zY2FsZWRfQ29yZF9wcmVkSyA8LSBjYmluZCgxLCB4X21hdF9QUkVET19zY2FsZWRfQ29yZF9wcmVkSykKY29sbmFtZXMoeF9tYXRfUFJFRE9fc2NhbGVkX0NvcmRfcHJlZEspIDwtIGMoIkludGVyY2VwdCIsICJjaGlsZCBzZXgiLCAiYmlydGggbGVuZ3RoIiwgImRlbGl2ZXJ5IG1vZGUiLCJtYXRlcm5hbCBtZW50YWwgZGlzb3JkZXJzIiwgIm1hdGVybmFsIHNtb2tpbmciKQpgYGAKCm1hdHJpeCBtdWx0aXBsaWNhdGlvbiBFUElDCmBgYHtyfQojWT1YKkIKeV9wcmVkX1BSRURPX2NvcmQgPC0geF9tYXRfUFJFRE9fc2NhbGVkX0NvcmRfcHJlZCAlKiUgQmV0YV9Db3JkX0lUVV9uCmBgYAoKbWF0cml4IG11bHRpcGxpY2F0aW9uIDQ1MEsKYGBge3J9CiNZPVgqQgp5X3ByZWRfUFJFRE9fY29yZEsgPC0geF9tYXRfUFJFRE9fc2NhbGVkX0NvcmRfcHJlZEsgJSolIEJldGFfQ29yZF9JVFVfbgpgYGAKCmRhdGEgRVBJQwpgYGB7cn0KUFJFRE9fY29yZF9wcmVkX2V4cF9yZWFsIDwtIGRhdGEuZnJhbWUoY2JpbmQoeV9wcmVkX1BSRURPX2NvcmQsIHlfbWF0X1BSRURPX3NjYWxlZF9Db3JkX3ByZWQpKQpuYW1lcyhQUkVET19jb3JkX3ByZWRfZXhwX3JlYWwpIDwtIGMoInByZWRpY3RlZF9FQUFSIiwgInJlYWxfRUFBUiIpCmBgYAoKZGF0YSA0NTBLCmBgYHtyfQpQUkVET19jb3JkX3ByZWRfZXhwX3JlYWxLIDwtIGRhdGEuZnJhbWUoY2JpbmQoeV9wcmVkX1BSRURPX2NvcmRLLCB5X21hdF9QUkVET19zY2FsZWRfQ29yZF9wcmVkSykpCm5hbWVzKFBSRURPX2NvcmRfcHJlZF9leHBfcmVhbEspIDwtIGMoInByZWRpY3RlZF9FQUFSIiwgInJlYWxfRUFBUiIpCmBgYAoKY29yIEVQSUMKYGBge3J9CmNvci50ZXN0KFBSRURPX2NvcmRfcHJlZF9leHBfcmVhbCRwcmVkaWN0ZWRfRUFBUixQUkVET19jb3JkX3ByZWRfZXhwX3JlYWwkcmVhbF9FQUFSLCBhbHRlcm5hdGl2ZT0iZ3JlYXRlciIpCiMgbiA9IDE0NAoKcGxvdF9wcmVkX3JlYWxfZXBpYyA8LSBnZ3NjYXR0ZXIoUFJFRE9fY29yZF9wcmVkX2V4cF9yZWFsLCB4ID0gInByZWRpY3RlZF9FQUFSIiwgeSA9ICJyZWFsX0VBQVIiLCAKICAgICAgICAgIGFkZCA9ICJyZWcubGluZSIsIGNvbmYuaW50ID0gVFJVRSwgCiAgICAgICAgICAjY29yLmNvZWYgPSBUUlVFLCBjb3IubWV0aG9kID0gInBlYXJzb24iLAogICAgICAgICAgeGxhYiA9ICJwcmVkaWN0ZWQgRUFBUiIsIHlsYWIgPSAidHJ1ZSBFQUFSIiwgc3VidGl0bGU9IlBSRURPIEVQSUMgKG49MTQ0KSIpKwogICBzdGF0X2NvcihsYWJlbC54ID0gLTAuNCwgbGFiZWwueT0zLHAuYWNjdXJhY3kgPSAwLjAwMSwgci5hY2N1cmFjeSA9IDAuMDEsIGFsdGVybmF0aXZlPSJncmVhdGVyIikrCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoc2l6ZT05KSwgYXhpcy50ZXh0Lnk9ZWxlbWVudF90ZXh0KHNpemU9OSksIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChzaXplPTEyKSwgYXhpcy50aXRsZS54PWVsZW1lbnRfdGV4dChzaXplPTEyKSwKICBwYW5lbC5ncmlkLm1ham9yID0gZWxlbWVudF9ibGFuaygpLAogIHBhbmVsLmdyaWQubWlub3IgPSBlbGVtZW50X2JsYW5rKCkpICsKICBzY2FsZV95X2NvbnRpbnVvdXMobGltaXRzID0gYygtMywzKSwgYnJlYWtzID0gc2VxKC0zLDMsIGJ5PTEpKSsKICBzY2FsZV94X2NvbnRpbnVvdXMobGltaXRzID0gYygtMC40LDAuNiksIGJyZWFrcyA9IHNlcSgtMC40LDAuNiwgYnk9MC4yKSkKYGBgCgpyKDE0MikgPSAuMjQsIHA9MC4wMDIKbj0xNDQKCmNvciA0NTBLCmBgYHtyfQpjb3IudGVzdChQUkVET19jb3JkX3ByZWRfZXhwX3JlYWxLJHByZWRpY3RlZF9FQUFSLFBSRURPX2NvcmRfcHJlZF9leHBfcmVhbEskcmVhbF9FQUFSLCBhbHRlcm5hdGl2ZT0iZ3JlYXRlciIpCgpwbG90X3ByZWRfcmVhbF80NTBrIDwtIGdnc2NhdHRlcihQUkVET19jb3JkX3ByZWRfZXhwX3JlYWxLLCB4ID0gInByZWRpY3RlZF9FQUFSIiwgeSA9ICJyZWFsX0VBQVIiLCAKICAgICAgICAgIGFkZCA9ICJyZWcubGluZSIsIGNvbmYuaW50ID0gVFJVRSwgCiAgICAgICAgICAjY29yLmNvZWYgPSBUUlVFLCBjb3IubWV0aG9kID0gInBlYXJzb24iLAogICAgICAgICAgeGxhYiA9ICJwcmVkaWN0ZWQgRUFBUiIsIHlsYWIgPSAidHJ1ZSBFQUFSIiwgc3VidGl0bGU9IlBSRURPIDQ1MEsgKG49NzY2KSIpKwogICBzdGF0X2NvcihsYWJlbC54ID0gLTAuNCwgbGFiZWwueT00LCBwLmFjY3VyYWN5ID0gMC4wMDEsIHIuYWNjdXJhY3kgPSAwLjAxLCBhbHRlcm5hdGl2ZT0iZ3JlYXRlciIpKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemU9OSksIGF4aXMudGV4dC55PWVsZW1lbnRfdGV4dChzaXplPTkpLCBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoc2l6ZT0xMiksIGF4aXMudGl0bGUueD1lbGVtZW50X3RleHQoc2l6ZT0xMiksCiAgcGFuZWwuZ3JpZC5tYWpvciA9IGVsZW1lbnRfYmxhbmsoKSwKICBwYW5lbC5ncmlkLm1pbm9yID0gZWxlbWVudF9ibGFuaygpKSArCiAgc2NhbGVfeV9jb250aW51b3VzKGxpbWl0cyA9IGMoLTQuNSw0KSwgYnJlYWtzID0gc2VxKC00LDQsIGJ5PTEpKSsKICBzY2FsZV94X2NvbnRpbnVvdXMobGltaXRzID0gYygtMC41LDAuOCksIGJyZWFrcyA9IHNlcSgtMC40LDAuOCwgYnk9MC4yKSkKIyBuID0gNzk2CmBgYAoKcig3NjQpID0gLjExLCBwPTAuMDAyCm49NzY2CgpgYGB7cn0KZ2dhcnJhbmdlKHBsb3RfcHJlZF9yZWFsX2VwaWMsIHBsb3RfcHJlZF9yZWFsXzQ1MGssIG5yb3c9MSkKYGBgCgpgYGB7cn0KcG5nKGZpbGU9IlJlc3VsdHMvRmlndXJlcy9wcmVkUFJFRE8vcHJlZGljdGlvbkVBQVJjb3JkLnBuZyIsIHdpZHRoPSAzNjAwLCBoZWlnaHQ9MjEwMCwgcmVzPTQ4MCkKZ2dhcnJhbmdlKHBsb3RfcHJlZF9yZWFsX2VwaWMsIHBsb3RfcHJlZF9yZWFsXzQ1MGssIG5yb3c9MSkKZGV2Lm9mZigpCgpwZGYoZmlsZT0iUmVzdWx0cy9GaWd1cmVzL3ByZWRQUkVETy9wcmVkaWN0aW9uRUFBUmNvcmQucGRmIiwgd2lkdGg9IDEwLCBoZWlnaHQ9NSkKZ2dhcnJhbmdlKHBsb3RfcHJlZF9yZWFsX2VwaWMsIHBsb3RfcHJlZF9yZWFsXzQ1MGssIG5yb3c9MSkKZGV2Lm9mZigpCmBgYAoKIyMgZWxhc3RpYyBuZXQgUFJFRE8gRVBJQyBDb3JkIGJsb29kIHsjZWxhc3RpY25ldENvcmRQUkVET30gIAptYWluIG1vZGVsLCB3aXRob3V0IGFsY29ob2wKCmBgYHtyfQpsb2FkKCJJbnB1dERhdGEvQ2xvY2tDYWxjdWxhdGlvbnNJbnB1dC9SZWdfSW5wdXRfRGF0YV9Db3JkYmxvb2RfUFJFRE9fRUFBUl9ub05hX24uUmRhdGEiKQpgYGAKCgpgYGB7cn0KeXJjX21hdF9QUkVET19Db3JkX24gPC0gbWF0cml4KFJlZ19JbnB1dF9EYXRhX0NvcmRibG9vZF9QUkVET19FQUFSX25vTmFfbiRFQUFSX0JvaGxpbikKeHJjX21hdF9QUkVET19Db3JkX24gPC0gbW9kZWwubWF0cml4KCB+IC4gLSBFQUFSX0JvaGxpbiwgZGF0YSA9IFJlZ19JbnB1dF9EYXRhX0NvcmRibG9vZF9QUkVET19FQUFSX25vTmFfbilbLCAtMV0KeXJjX21hdF9QUkVET19zY2FsZWRfQ29yZF9uIDwtIHNjYWxlKHlyY19tYXRfUFJFRE9fQ29yZF9uKQp4cmNfbWF0X1BSRURPX3NjYWxlZF9Db3JkX24gPC0gc2NhbGUoeHJjX21hdF9QUkVET19Db3JkX24pCmBgYAoKPCEtLSBzZXQgc2VlZCAtLT4KPCEtLSBgYGB7cn0gLS0+CjwhLS0gc2V0LnNlZWQoMjAyMCkgLS0+CjwhLS0gYGBgIC0tPgoKCjwhLS0gYGBge3IsIHdhcm5pbmc9Rn0gLS0+CjwhLS0gICBuYm9vdCA9IDEwMDAgLS0+Cgo8IS0tICAgc3RhcnRfdGltZSA8LSBTeXMudGltZSgpIC0tPgo8IS0tICAgYm9vdHN0cmFwc19Db3JkX1BSRURPX24gPC0gcmVwbGljYXRlKG5ib290LCB7IC0tPgo8IS0tICAgICByd3MgPC0gc2FtcGxlKDE6bnJvdyh4cmNfbWF0X1BSRURPX3NjYWxlZF9Db3JkX24pLCByZXBsYWNlID0gVFJVRSkgLS0+CjwhLS0gICAgIGVuc3IoeHJjX21hdF9QUkVET19zY2FsZWRfQ29yZF9uW3J3cywgXSwgeXJjX21hdF9QUkVET19zY2FsZWRfQ29yZF9uW3J3cywgXSwgc3RhbmRhcmRpemVkID0gRkFMU0UsIGZhbWlseT0iZ2F1c3NpYW4iLCBubGFtYmRhPTEwMCwgbmZvbGRzPTEwLCBhbHBoYT1jKDAuMCwwLjEsMC4yLDAuMywwLjQsMC41LDAuNiwwLjcsMC44LDAuOSwxLjApKSAtLT4KPCEtLSAgIH0sIC0tPgo8IS0tICAgc2ltcGxpZnkgPSBGQUxTRSkgLS0+Cgo8IS0tICAgZW5kX3RpbWUgPC0gU3lzLnRpbWUoKSAtLT4KPCEtLSAgIGVuZF90aW1lIC0gc3RhcnRfdGltZSAtLT4KCjwhLS0gYGBgIC0tPgoKPCEtLSBgYGB7cn0gLS0+CjwhLS0gc2F2ZShib290c3RyYXBzX0NvcmRfUFJFRE9fbiwgZmlsZT0iSW5wdXREYXRhL0RhdGFfRWxhc3RpY05ldHMvYm9vdHN0cmFwc19Db3JkX1BSRURPX25fMTAwMC5SZGF0YSIpIC0tPgo8IS0tIGBgYCAtLT4KCgpgYGB7cn0KbG9hZCgiSW5wdXREYXRhL0RhdGFfRWxhc3RpY05ldHMvYm9vdHN0cmFwc19Db3JkX1BSRURPX25fMTAwMC5SZGF0YSIpCmBgYAoKZmlyc3QgZ2V0IGEgc3VtbWFyeSBvZiBhbGwgZW5zciBvYmplY3RzCmBgYHtyfQpzdW1tYXJpZXNfQ29yZF9QUkVET19uIDwtCiAgYm9vdHN0cmFwc19Db3JkX1BSRURPX24gJT4lCiAgbGFwcGx5KHN1bW1hcnkpICU+JQogIHJiaW5kbGlzdChpZGNvbCA9ICJib290c3RyYXAiKQoKc3VtbWFyaWVzX0NvcmRfUFJFRE9fbgpgYGAKCgpgYGB7cn0Kc3VtbWFyaWVzX0NvcmRfUFJFRE9fblssIC5TRFtjdm0gPT0gbWluKGN2bSldLCBieSA9IGMoImJvb3RzdHJhcCIsICJuemVybyIpXSAlPiUKICBnZ3Bsb3QyOjpnZ3Bsb3QoZGF0YSA9IC4pICsKICBnZ3Bsb3QyOjphZXMoeCA9IG56ZXJvLCB5ID0gY3ZtLCBncm91cCA9IGJvb3RzdHJhcCkgKwogIGdncGxvdDI6Omdlb21fcG9pbnQoKSArCiAgZ2dwbG90Mjo6Z2VvbV9saW5lKCkrCiAgZ2dwbG90Mjo6bGFicyh4PSJcbm56ZXJvIiwgeT0iY3ZtXG4iKSsKICBnZ3Bsb3QyOjp0aGVtZSh0ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNSksIGF4aXMudGl0bGUueD0gZWxlbWVudF90ZXh0KHNpemU9MTUpLCBheGlzLnRpdGxlLnk9IGVsZW1lbnRfdGV4dChzaXplPTE1KSkrCiAgZ2dwbG90Mjo6dGhlbWVfYncoKQogIApgYGAKCgpgYGB7cn0KcG5nKGZpbGVuYW1lPSJSZXN1bHRzL0ZpZ3VyZXMvZWxhc3RpY05ldF9zaW5nbGVUaXNzdWVzL091dGNvbWVfbWFpbi9ib290c3RyYXBzX0NvcmRfUFJFRE8ucG5nIiwgd2lkdGg9MjIwMCwgaGVpZ2h0PTE0MDAsIHJlcz0zMDApCnN1bW1hcmllc19Db3JkX1BSRURPX25bLCAuU0RbY3ZtID09IG1pbihjdm0pXSwgYnkgPSBjKCJib290c3RyYXAiLCAibnplcm8iKV0gJT4lCiAgZ2dwbG90Mjo6Z2dwbG90KGRhdGEgPSAuKSArCiAgZ2dwbG90Mjo6YWVzKHggPSBuemVybywgeSA9IGN2bSwgZ3JvdXAgPSBib290c3RyYXApICsKICBnZ3Bsb3QyOjpnZW9tX3BvaW50KCkgKwogIGdncGxvdDI6Omdlb21fbGluZSgpKwogIGdncGxvdDI6OmxhYnMoeD0iXG5uemVybyIsIHk9ImN2bVxuIikrCiAgZ2dwbG90Mjo6dGhlbWUodGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTUpLCBheGlzLnRpdGxlLng9IGVsZW1lbnRfdGV4dChzaXplPTE1KSwgYXhpcy50aXRsZS55PSBlbGVtZW50X3RleHQoc2l6ZT0xNSkpKwogIGdncGxvdDI6OnRoZW1lX2J3KCkKZGV2Lm9mZigpCmBgYAoKCjwhLS0gYGBge3IsIHdhcm5pbmc9RkFMU0V9IC0tPgo8IS0tICMgbG93ZXN0IGN2bSBieSBib290c3RyYXAgYW5kIG56ZXJvIC0tPgo8IS0tIHBtX0NvcmRfUFJFRE9fbiA8LSBzdW1tYXJpZXNfQ29yZF9QUkVET19uWywgLlNEW2N2bSA9PSBtaW4oY3ZtKV0sIGJ5ID0gYygiYm9vdHN0cmFwIiwgIm56ZXJvIildIC0tPgo8IS0tIHBtMl9Db3JkX1BSRURPX24gPC0gTlVMTCAtLT4KCjwhLS0gZm9yKGkgaW4gYXMuaW50ZWdlcihzZXEoMSwgbnJvdyhwbV9Db3JkX1BSRURPX24pLCBieSA9IDEpKSkgeyAtLT4KPCEtLSAgIHBtMl9Db3JkX1BSRURPX24gPC0gcmJpbmQocG0yX0NvcmRfUFJFRE9fbiwgLS0+CjwhLS0gICAgICAgICAgICAgICAgY2JpbmQocG1fQ29yZF9QUkVET19uW2ksIF0sIC0tPgo8IS0tICAgICAgICAgICAgICAgIHQoYXMubWF0cml4KGNvZWYoYm9vdHN0cmFwc19Db3JkX1BSRURPX25bW3BtX0NvcmRfUFJFRE9fbltpLCBib290c3RyYXBdXV1bW3BtX0NvcmRfUFJFRE9fbltpLCBsX2luZGV4XV1dLCBzID0gcG1fQ29yZF9QUkVET19uW2ksIGxhbWJkYV0pKSkgLS0+CjwhLS0gICAgICAgICAgICAgICAgKSAtLT4KPCEtLSAgICkgLS0+CjwhLS0gfSAtLT4KCjwhLS0gcG0yX0NvcmRfUFJFRE9fbiAtLT4KPCEtLSBgYGAgLS0+CgoKPCEtLSBgYGB7cn0gLS0+CjwhLS0gIyBzYXZlICJwcmVmZXJhYmxlIG1vZGVscyIgLS0+CjwhLS0gc2F2ZShwbTJfQ29yZF9QUkVET19uLCBmaWxlPSJJbnB1dERhdGEvRGF0YV9FbGFzdGljTmV0cy9wbTJfQ29yZF9QUkVET19uLlJkYXRhIikgLS0+CjwhLS0gYGBgIC0tPgoKCmBgYHtyfQpsb2FkKCJJbnB1dERhdGEvRGF0YV9FbGFzdGljTmV0cy9wbTJfQ29yZF9QUkVET19uLlJkYXRhIikKIyBjb2VmZmljaWVudCB2YWx1ZXMgZm9yIHRoZSBtb2RlbHMgd2l0aCBzbWFsbGVzdCBjdm0gYnkgbnVtYmVyIG9mIG5vbi1lcnpvIGNvZWZmaWNpZW50cyBhbmQgYm9vdHN0cmFwCmBgYAoKbG9vayBob3cgb2Z0ZW4gYSBwYXJ0aWN1bGFyIHZhcmlhYmxlIGlzIGFzc29jaWF0ZWQgd2l0aCBhIG5vbi16ZXJvIGNvZWZmaWNpZW50IGluIGEgbW9kZWwgd2l0aCBhIGdpdmVuIG51bWJlciBvZiBub24temVybyBjb2VmZmljaWVudHMgKG92ZXIgYWxsIGJvb3RzdHJhcHMpCgpgYGB7cn0KY3N1bW1hcnlfQ29yZF9QUkVET19uIDwtIFJlZHVjZShmdW5jdGlvbih4LHkpIG1lcmdlKHggPSB4LCB5ID0geSwgYnkgPSAibnplcm8iKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0KHBtMl9Db3JkX1BSRURPX25bLCBsYXBwbHkoLlNELCBmdW5jdGlvbih4KSB7bWVhbih4ICE9IDApfSksIC5TRGNvbHMgPSBjKCJDaGlsZF9TZXhmZW1hbGUiLCAiQmlydGhfV2VpZ2h0IiwgIkJpcnRoX0xlbmd0aCIsICJIZWFkX0NpcmN1bWZlcmVuY2VfYXRfQmlydGgiLCAiRGVsaXZlcnlfTW9kZV9kaWNob3RvbWFpZGVkIiwgImluZHVjZWRsYWJvdXJZZXMiLCAiUGFyaXR5X2RpY2hvdG9tZ2l2ZW4gYmlydGggYmVmb3JlIiwgIk1hdGVybmFsX0FnZV8xOFBvcFJlZ2FuZEJSIiwgIk1hdGVybmFsX1ByZXByZWduYW5jeUJNSTE4b2N0MjhuZXciLCAibWF0ZXJuYWxfaHlwZXJ0ZW5zaW9uX2RpY2hvdG9taHlwZXJ0ZW5zaW9uIGluIGN1cnJlbnQgcHJlZ25hbmN5IiwgIm1hdGVybmFsX2RpYWJldGVzX2RpY2hvdG9tZGlhYmV0ZXMgaW4gY3VycmVudCBwcmVnbmFuY3kiLCAiTWF0ZXJuYWxfTWVudGFsX0Rpc29yZGVyc19CeV9DaGlsZGJpcnRoWWVzIiwgInNtb2tpbmdfZGljaG90b215ZXMiKSwgYnkgPSBuemVyb10KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbTJfQ29yZF9QUkVET19uWywgLihtZWFuX2N2bSA9IG1lYW4oY3ZtKSksIGJ5ID0gbnplcm9dLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbTJfQ29yZF9QUkVET19uWywgLihtZWRpYW5fY3ZtID0gbWVkaWFuKGN2bSkpLCBieSA9IG56ZXJvXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSlbb3JkZXIobnplcm8pXQoKY3N1bW1hcnlfQ29yZF9QUkVET19uCmBgYAoKCmBgYHtyfQpnMV9Db3JkX1BSRURPX24gPC0KICBjc3VtbWFyeV9Db3JkX1BSRURPX24gJT4lCiAgbWVsdChpZC52YXJzID0gYygibnplcm8iLCAibWVhbl9jdm0iLCAibWVkaWFuX2N2bSIpKSAlPiUKICBnZ3Bsb3QyOjpnZ3Bsb3QoLikgKwogIGdncGxvdDI6OnRoZW1lX2J3KCkgKwogIGdncGxvdDI6OmFlcyh4ID0gbnplcm8pICsKICBnZ3Bsb3QyOjpnZW9tX3BvaW50KG1hcHBpbmcgPSBnZ3Bsb3QyOjphZXMoeSA9IHZhcmlhYmxlLCBzaXplID0gdmFsdWUsIGFscGhhID0gdmFsdWUsIGNvbG9yID0gdmFsdWUqMTAwKSkgKwogIGdncGxvdDI6OnNjYWxlX2NvbG9yX2dyYWRpZW50MihoaWdoID0gJ2dyZWVuJywgbWlkID0gInB1cnBsZSIsIGxvdyA9ICJibGFjayIsIG1pZHBvaW50ID01MCkrCiAgZ2dwbG90Mjo6c2NhbGVfYWxwaGEoZ3VpZGUgPSAnbm9uZScpKwogIGdncGxvdDI6OnNjYWxlX3NpemUoZ3VpZGUgPSAnbm9uZScpKwogIGdncGxvdDI6OnNjYWxlX3lfZGlzY3JldGUobGFiZWxzPSBjKCJjaGlsZCBzZXgiLCAiYmlydGggd2VpZ2h0IiwgImJpcnRoIGxlbmd0aCIsICJoZWFkIGNpcmN1bWZlcmVuY2UiLCAiZGVsaXZlcnkgbW9kZSIsICJpbmR1Y2VkIGxhYm9yIiwgInBhcml0eSIsICJtYXRlcm5hbCBhZ2UiLCAibWF0ZXJuYWwgQk1JIiwgIm1hdGVybmFsIGh5cGVydGVuc2lvbiIsICJtYXRlcm5hbCBkaWFiZXRlcyIsICJtYXRlcm5hbCBtZW50YWwgZGlzb3JkZXJzIiwgIm1hdGVybmFsIHNtb2tpbmciKSkrCiAgZ2dwbG90Mjo6c2NhbGVfeF9jb250aW51b3VzKGJyZWFrcz0wOjE0LCBsYWJlbHM9KSsKICBnZ3Bsb3QyOjpsYWJzKHk9InByZWRpY3RvclxuIiwgeCA9ICJcbm51bWJlciBvZiBub24temVybyBjb2VmZmljaWVudHMiLCBjb2xvcj0iJSIpKwogIGdncGxvdDI6OnRoZW1lKHRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE1KSwgYXhpcy50aXRsZS54PSBlbGVtZW50X3RleHQoc2l6ZT0xNSksIGF4aXMudGl0bGUueT0gZWxlbWVudF90ZXh0KHNpemU9MTUpKQogIAoKZzJfQ29yZF9QUkVET19uIDwtCiAgY3N1bW1hcnlfQ29yZF9QUkVET19uICU+JQogIGdncGxvdDI6OmdncGxvdCguKSArCiAgZ2dwbG90Mjo6dGhlbWVfYncoKSArCiAgZ2dwbG90Mjo6YWVzKHggPSBuemVybywgeSA9IG1lZGlhbl9jdm0pICsKICBnZ3Bsb3QyOjpnZW9tX3BvaW50KCkgKyBnZ3Bsb3QyOjpnZW9tX2xpbmUoKSsKICBnZ3Bsb3QyOjpsYWJzKHk9Im1lZGlhbiBjdm0iLCB4ID0gIm56ZXJvIikrCiAgZ2dwbG90Mjo6c2NhbGVfeF9jb250aW51b3VzKGJyZWFrcz0wOjE0LCBsYWJlbHM9KSsKICBnZ3Bsb3QyOjp0aGVtZShheGlzLnRleHQ9ZWxlbWVudF90ZXh0KHNpemU9MTUpLGF4aXMudGl0bGU9ZWxlbWVudF90ZXh0KHNpemU9MTgpKQoKZ3JpZEV4dHJhOjpncmlkLmFycmFuZ2UoZzFfQ29yZF9QUkVET19uLCBnMl9Db3JkX1BSRURPX24sIG5jb2wgPSAxKQpnMV9Db3JkX1BSRURPX24KYGBgCgoKYGBge3J9CnBuZyhmaWxlbmFtZT0iUmVzdWx0cy9GaWd1cmVzL2VsYXN0aWNOZXRfc2luZ2xlVGlzc3Vlcy9PdXRjb21lX21haW4vTW9kZWxfQ29yZF9QUkVETy5wbmciLCB3aWR0aD0yODAwLCBoZWlnaHQ9MTQwMCwgcmVzPTQwMCkKZzFfQ29yZF9QUkVET19uCmRldi5vZmYoKQpgYGAKYGBge3J9CnBuZyhmaWxlbmFtZT0iUmVzdWx0cy9GaWd1cmVzL2VsYXN0aWNOZXRfc2luZ2xlVGlzc3Vlcy9PdXRjb21lX21haW4vYm9vdHN0cmFwTW9kZWxzX0NvcmRfUFJFRE8ucG5nIiwgd2lkdGg9MjgwMCwgaGVpZ2h0PTE0MDAsIHJlcz0zMDApCmdyaWRFeHRyYTo6Z3JpZC5hcnJhbmdlKGcxX0NvcmRfUFJFRE9fbiwgZzJfQ29yZF9QUkVET19uLCBuY29sID0gMSkKZGV2Lm9mZigpCmBgYAoKCmBgYHtyfQplbGJvd19maW5kZXIoY3N1bW1hcnlfQ29yZF9QUkVET19uJG56ZXJvLCBjc3VtbWFyeV9Db3JkX1BSRURPX24kbWVkaWFuX2N2bSkKCm56ZXJvX2luZGljZXNfQ29yZCA8LSBkYXRhLmZyYW1lKHQoZWxib3dfZmluZGVyKGNzdW1tYXJ5X0NvcmRfUFJFRE9fbiRuemVybywgY3N1bW1hcnlfQ29yZF9QUkVET19uJG1lZGlhbl9jdm0pKSkKY29sbmFtZXMobnplcm9faW5kaWNlc19Db3JkKSA8LSBjKCJ4IiwgInkiKQpyb3duYW1lcyhuemVyb19pbmRpY2VzX0NvcmQpIDwtIE5VTEwKYGBgCgpgYGB7cn0Kbnplcm9fZmluYWxfY29yZF9wcmVkbyA8LSA3CmBgYAoKYGBge3J9CmNzdW1tYXJ5X0NvcmRfUFJFRE9fbltuemVybyAlaW4lIG56ZXJvX2ZpbmFsX2NvcmRfcHJlZG9dCmBgYAoKYGBge3J9CnN1bW1hcnlfQ29yZF9QUkVET19uX2ZpbmFsbnplcm8gPC0gY3N1bW1hcnlfQ29yZF9QUkVET19uW256ZXJvICVpbiUgbnplcm9fZmluYWxfY29yZF9wcmVkb10Kc2lnX3Zhcl9uYW1lc19Db3JkX1BSRURPX25fZmluYWxuemVybyA8LSBGaWx0ZXIoZnVuY3Rpb24oeCkgYW55KHggPiAwLjc1KSwgc3VtbWFyeV9Db3JkX1BSRURPX25fZmluYWxuemVyb1ssIWMoIm56ZXJvIiwgIm1lYW5fY3ZtIiwgIm1lZGlhbl9jdm0iKV0pICU+JSBjb2xuYW1lcygpCmNvbG5hbWVzKHN1bW1hcnlfQ29yZF9QUkVET19uX2ZpbmFsbnplcm8pIDwtIGMoIm5vbi16ZXJvIiwgImNoaWxkIHNleCAoZmVtYWxlKSIsICJiaXJ0aCB3ZWlnaHQiLCAiYmlydGggbGVuZ3RoIiwgImhlYWQgY2lyY3VtZmVyZW5jZSIsICJkZWxpdmVyeSBtb2RlIChhaWRlZCkiLCAiaW5kdWNlZCBsYWJvciAoeWVzKSIsICJwYXJpdHkgKGJpcnRoIGJlZm9yZSkiLCAibWF0ZXJuYWwgYWdlIiwgIm1hdGVybmFsIEJNSSIsICJtYXRlcm5hbCBoeXBlcnRlbnNpb24gKHllcykiLCAibWF0ZXJuYWwgZGlhYmV0ZXMgKHllcykiLCAibWF0ZXJuYWwgbWVudGFsIGRpc29yZGVycyAoeWVzKSIsICJtYXRlcm5hbCBzbW9raW5nICh5ZXMpIiwgIm1lYW4gY3ZtIiwgIm1lZGlhbiBjdm0iKQpzdW1tYXJ5X0NvcmRfUFJFRE9fbl9maW5hbG56ZXJvVCA8LSBhcy5kYXRhLmZyYW1lKHQoc3VtbWFyeV9Db3JkX1BSRURPX25fZmluYWxuemVyb1ssLWMoIm5vbi16ZXJvIiwgIm1lZGlhbiBjdm0iLCAibWVhbiBjdm0iKV0pKQpzdW1tYXJ5X0NvcmRfUFJFRE9fbl9maW5hbG56ZXJvVCR2YXJpYWJsZSA8LSByb3duYW1lcyhzdW1tYXJ5X0NvcmRfUFJFRE9fbl9maW5hbG56ZXJvVCkKcm93bmFtZXMoc3VtbWFyeV9Db3JkX1BSRURPX25fZmluYWxuemVyb1QpIDwtIE5VTEwKbmFtZXMoc3VtbWFyeV9Db3JkX1BSRURPX25fZmluYWxuemVyb1QpW25hbWVzKHN1bW1hcnlfQ29yZF9QUkVET19uX2ZpbmFsbnplcm9UKSA9PSAnVjEnXSA8LSAncGVyY2VudCcKc3VtbWFyeV9Db3JkX1BSRURPX25fZmluYWxuemVyb1QgPC0gc3VtbWFyeV9Db3JkX1BSRURPX25fZmluYWxuemVyb1Rbb3JkZXIoc3VtbWFyeV9Db3JkX1BSRURPX25fZmluYWxuemVyb1QkcGVyY2VudCksXQoKc3VtbWFyeV9Db3JkX1BSRURPX25fZmluYWxuemVyb1QkbnVtYmVyIDwtIHNlcSgxLCBsZW5ndGgoc3VtbWFyeV9Db3JkX1BSRURPX25fZmluYWxuemVyb1QkdmFyaWFibGUpKQpgYGAKCmBgYHtyLCBmaWcud2lkdGg9OH0KcGVyY192YXJzX0NvcmRfUFJFRE9fbiA8LSAKICBnZ3Bsb3Qoc3VtbWFyeV9Db3JkX1BSRURPX25fZmluYWxuemVyb1QsIGFlcyhyZW9yZGVyKHZhcmlhYmxlLCBwZXJjZW50KSwgcGVyY2VudCwgZ3JvdXA9MSkpKwogIGdlb21fcG9pbnQoKSsgZ2VvbV9saW5lKCkrCiAgeWxhYigiXG4lIG9jY3VyZW5jZSBpbiBtb2RlbHMgd2l0aCBuemVybyBjb2VmZmljaWVudHMgPSA5ICAgICIpKwogIHNjYWxlX3lfY29udGludW91cyhicmVha3M9YygwLjEsMC4yLDAuMywwLjQsMC41LDAuNiwwLjcsMC44LDAuOSkpKwogIHhsYWIoInByZWRpY3RvclxuIikrCiAgY29vcmRfZmxpcCgpKwogIGdlb21faGxpbmUoeWludGVyY2VwdD0wLjc1LCBsaW5ldHlwZT0iZG90dGVkIikrCiAgdGhlbWVfYncoKSsKICB0aGVtZSh0ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNSksIGF4aXMudGl0bGUueD0gZWxlbWVudF90ZXh0KHNpemU9MTUpLCBheGlzLnRpdGxlLnk9IGVsZW1lbnRfdGV4dChzaXplPTE1KSkKCnBlcmNfdmFyc19Db3JkX1BSRURPX24KCiMgZGVjaWRlIGZvciBjdXQtb2ZmICUgLT4gaGVyZSAuNzUKCkZpbHRlcihmdW5jdGlvbih4KSBhbnkoeCA+IDAuNzUpLCBzdW1tYXJ5X0NvcmRfUFJFRE9fbl9maW5hbG56ZXJvWywhYygibm9uLXplcm8iLCAibWVhbiBjdm0iLCAibWVkaWFuIGN2bSIpXSkKCmBgYAoKYGBge3J9CnBtMl9Db3JkX1BSRURPX25fY29lZiA8LQogIGRjYXN0KHBtMl9Db3JkX1BSRURPX25bLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzLmxpc3QodW5saXN0KAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwcGx5KC5TRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbih4KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5IDwtIHVubmFtZShxdWFudGlsZSh4W3ggIT0gMF0sIHByb2JzID0gYygwLjAyNSwgMC45NzUpKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3QoIm5vbl96ZXJvIiA9IDEwMCAqIG1lYW4oeCAhPSAwKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGNsID0geVsxXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWNsID0geVsyXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGggPSBkaWZmKHkpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYW4gPSBtZWRpYW4oeFt4IT0gMF0pKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLlNEY29scyA9IGMoIkNoaWxkX1NleGZlbWFsZSIsICJCaXJ0aF9XZWlnaHQiLCAiQmlydGhfTGVuZ3RoIiwgIkhlYWRfQ2lyY3VtZmVyZW5jZV9hdF9CaXJ0aCIsICJEZWxpdmVyeV9Nb2RlX2RpY2hvdG9tYWlkZWQiLCAiaW5kdWNlZGxhYm91clllcyIsICJQYXJpdHlfZGljaG90b21naXZlbiBiaXJ0aCBiZWZvcmUiLCAiTWF0ZXJuYWxfQWdlXzE4UG9wUmVnYW5kQlIiLCAiTWF0ZXJuYWxfUHJlcHJlZ25hbmN5Qk1JMThvY3QyOG5ldyIsICJtYXRlcm5hbF9oeXBlcnRlbnNpb25fZGljaG90b21oeXBlcnRlbnNpb24gaW4gY3VycmVudCBwcmVnbmFuY3kiLCAibWF0ZXJuYWxfZGlhYmV0ZXNfZGljaG90b21kaWFiZXRlcyBpbiBjdXJyZW50IHByZWduYW5jeSIsICJNYXRlcm5hbF9NZW50YWxfRGlzb3JkZXJzX0J5X0NoaWxkYmlydGhZZXMiLCAic21va2luZ19kaWNob3RvbXllcyIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5ID0gbnplcm9dW29yZGVyKG56ZXJvKV0gJT4lCiAgICAgICAgICBtZWx0KGlkLnZhciA9ICJuemVybyIpICU+JQogICAgICAgICAgLlssIG1ldHJpYyA6PSBzdWIoIl4uK1xcLiguKykkIiwgIlxcMSIsIHZhcmlhYmxlKV0gJT4lCiAgICAgICAgICAuWywgdmFyaWFibGUgOj0gc3ViKCJeKC4rKVxcLi4rJCIsICJcXDEiLCB2YXJpYWJsZSldICU+JQogICAgICAgICAgLltuemVybyA9PW56ZXJvX2ZpbmFsX2NvcmRfcHJlZG9dLCBuemVybysgdmFyaWFibGUgfiBtZXRyaWMsIHZhbHVlLnZhcj0idmFsdWUiKQoKIyBnZXQgZGVzaXJlZCBvcmRlciBvZiBwcmVkaWN0b3JzCnBtMl9Db3JkX1BSRURPX25fY29lZiA8LQogIHBtMl9Db3JkX1BSRURPX25fY29lZlttYXRjaChjKCJDaGlsZF9TZXhmZW1hbGUiLCAiQmlydGhfV2VpZ2h0IiwgIkJpcnRoX0xlbmd0aCIsICJIZWFkX0NpcmN1bWZlcmVuY2VfYXRfQmlydGgiLCAiRGVsaXZlcnlfTW9kZV9kaWNob3RvbWFpZGVkIiwgImluZHVjZWRsYWJvdXJZZXMiLCAiUGFyaXR5X2RpY2hvdG9tZ2l2ZW4gYmlydGggYmVmb3JlIiwgIk1hdGVybmFsX0FnZV8xOFBvcFJlZ2FuZEJSIiwgIk1hdGVybmFsX1ByZXByZWduYW5jeUJNSTE4b2N0MjhuZXciLCAibWF0ZXJuYWxfaHlwZXJ0ZW5zaW9uX2RpY2hvdG9taHlwZXJ0ZW5zaW9uIGluIGN1cnJlbnQgcHJlZ25hbmN5IiwgIm1hdGVybmFsX2RpYWJldGVzX2RpY2hvdG9tZGlhYmV0ZXMgaW4gY3VycmVudCBwcmVnbmFuY3kiLCAiTWF0ZXJuYWxfTWVudGFsX0Rpc29yZGVyc19CeV9DaGlsZGJpcnRoWWVzIiwgInNtb2tpbmdfZGljaG90b215ZXMiKSwgcG0yX0NvcmRfUFJFRE9fbl9jb2VmJHZhcmlhYmxlKSxdCnBtMl9Db3JkX1BSRURPX25fY29lZiR2YXJpYWJsZSA8LSBmYWN0b3IocG0yX0NvcmRfUFJFRE9fbl9jb2VmJHZhcmlhYmwsIGxldmVscz11bmlxdWUocG0yX0NvcmRfUFJFRE9fbl9jb2VmJHZhcmlhYmxlKSkKCmBgYAoKYGBge3J9CndyaXRlX3hsc3gocG0yX0NvcmRfUFJFRE9fbl9jb2VmLCJSZXN1bHRzL1RhYmxlcy9Db2VmZmljaWVudHNfQ29yZF9QUkVETy54bHN4IikKYGBgCgpgYGB7cn0KY29lZl9Db3JkX1BSRURPX24gPC0gCiAgZ2dwbG90KHBtMl9Db3JkX1BSRURPX25fY29lZiwgYWVzKHkgPSB2YXJpYWJsZSwgeD1tZWRpYW4pKSsKICBnZW9tX3BvaW50KG1hcHBpbmcgPSBnZ3Bsb3QyOjphZXMoeSA9IHZhcmlhYmxlLCBzaXplID1ub25femVybywgYWxwaGEgPSBub25femVybywgY29sb3IgPSBub25femVybykpKwogIHNjYWxlX2NvbG9yX2dyYWRpZW50MihoaWdoID0gJ2dyZWVuJywgbWlkID0gInB1cnBsZSIsIGxvdyA9ICJibGFjayIsIG1pZHBvaW50ID01MCwgbGltaXRzPWMoMCwxMDApKSsKICBzY2FsZV9hbHBoYShndWlkZSA9ICdub25lJykrCiAgc2NhbGVfc2l6ZShndWlkZSA9ICdub25lJykrCiAgZ2VvbV9wb2ludCgpKwogIGdlb21fZXJyb3JiYXIoYWVzKHkgPSB2YXJpYWJsZSwgeG1pbiA9IGxjbCwgeG1heCA9IHVjbCksIHdpZHRoID0gMC4yKSsKICBsYWJzKHk9InByZWRpY3RvciIsIHggPSAiXG5tZWRpYW4gJiA5NSUgQ0kgb2YgY29lZmZpY2llbnQgKG92ZXIgYm9vdHN0cmFwcykiLCBjb2xvcj0iJSIpKwogIHNjYWxlX3hfY29udGludW91cyhsaW1pdHM9YygtMC40LDAuNCksIGJyZWFrcz1jKC0uNCwtLjMsLS4yLCAtLjEsIDAsIC4xLCAuMiwgLjMsIC40KSkrCiAgc2NhbGVfeV9kaXNjcmV0ZShsYWJlbHM9IGMoImNoaWxkIHNleCAoZmVtYWxlKSIsICJiaXJ0aCB3ZWlnaHQiLCAiYmlydGggbGVuZ3RoIiwgImhlYWQgY2lyY3VtZmVyZW5jZSIsICJkZWxpdmVyeSBtb2RlIChhaWRlZCkiLCAiaW5kdWNlZCBsYWJvciAoeWVzKSIsICJwYXJpdHkgKGJpcnRoIGJlZm9yZSkiLCAibWF0ZXJuYWwgYWdlIiwgIm1hdGVybmFsIEJNSSIsICJtYXRlcm5hbCBoeXBlcnRlbnNpb24gKHllcykiLCAibWF0ZXJuYWwgZGlhYmV0ZXMgKHllcykiLCAibWF0ZXJuYWwgbWVudGFsIGRpc29yZGVycyAoeWVzKSIsICJtYXRlcm5hbCBzbW9raW5nICh5ZXMpIikpKwogIGdlb21fdmxpbmUoeGludGVyY2VwdD0wLCBsaW5ldHlwZT0iZGFzaGVkIikrCiAgdGhlbWVfYncoKSsKICB0aGVtZSh0ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNSksIGF4aXMudGl0bGUueD0gZWxlbWVudF90ZXh0KHNpemU9MTUpLCBheGlzLnRpdGxlLnk9IGVsZW1lbnRfdGV4dChzaXplPTE1KSkKCgpjb2VmX0NvcmRfUFJFRE9fbgpgYGAKCmBgYHtyfQpwbmcoZmlsZW5hbWU9IlJlc3VsdHMvRmlndXJlcy9lbGFzdGljTmV0X3NpbmdsZVRpc3N1ZXMvT3V0Y29tZV9tYWluL2NvZWZfQ29yZF9QUkVETy5wbmciLCAgd2lkdGg9MjgwMCwgaGVpZ2h0PTE0MDAsIHJlcz00MDApCmNvZWZfQ29yZF9QUkVET19uCmRldi5vZmYoKQpgYGAKCgpgYGB7cn0KcDEgPC0KICBjc3VtbWFyeV9Db3JkX1BSRURPX24gJT4lCiAgbWVsdChpZC52YXJzID0gYygibnplcm8iLCAibWVhbl9jdm0iLCAibWVkaWFuX2N2bSIpKSAlPiUKICBnZ3Bsb3QyOjpnZ3Bsb3QoLikgKwogIGdncGxvdDI6OnRoZW1lX2J3KCkgKwogIGdncGxvdDI6OmFlcyh4ID0gbnplcm8pICsKICBnZ3Bsb3QyOjpnZW9tX3BvaW50KG1hcHBpbmcgPSBnZ3Bsb3QyOjphZXMoeSA9IHZhcmlhYmxlLCBzaXplID0gdmFsdWUsIGFscGhhID0gdmFsdWUsIGNvbG9yID0gdmFsdWUqMTAwKSkgKwogIGdncGxvdDI6OnNjYWxlX2NvbG9yX2dyYWRpZW50MihoaWdoID0gJ2dyZWVuJywgbWlkID0gInB1cnBsZSIsIGxvdyA9ICJibGFjayIsIG1pZHBvaW50ID01MCkrCiAgZ2dwbG90Mjo6c2NhbGVfYWxwaGEoZ3VpZGUgPSAnbm9uZScpKwogIGdncGxvdDI6OnNjYWxlX3NpemUoZ3VpZGUgPSAnbm9uZScpKwogIGdncGxvdDI6OnNjYWxlX3lfZGlzY3JldGUobGFiZWxzPSBjKCJjaGlsZCBzZXggKGZlbWFsZSkiLCAiYmlydGggd2VpZ2h0IiwgImJpcnRoIGxlbmd0aCIsICJoZWFkIGNpcmN1bWZlcmVuY2UiLCAiZGVsaXZlcnkgbW9kZSAoYWlkZWQpIiwgImluZHVjZWQgbGFib3IgKHllcykiLCAicGFyaXR5IChiaXJ0aCBiZWZvcmUpIiwgIm1hdGVybmFsIGFnZSIsICJtYXRlcm5hbCBCTUkiLCAibWF0ZXJuYWwgaHlwZXJ0ZW5zaW9uICh5ZXMpIiwgIm1hdGVybmFsIGRpYWJldGVzICh5ZXMpIiwgIm1hdGVybmFsIG1lbnRhbCBkaXNvcmRlcnMgKHllcykiLCAibWF0ZXJuYWwgc21va2luZyAoeWVzKSIpKSsKICBnZ3Bsb3QyOjpzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzPTA6MTQsIGxhYmVscz0pKwogIGdncGxvdDI6OmxhYnMoeT0icHJlZGljdG9yXG4iLCB4ID0gIlxubnVtYmVyIG9mIG5vbi16ZXJvIGNvZWZmaWNpZW50cyIsIGNvbG9yPSIlIikrCiAgZ2dwbG90Mjo6dGhlbWUodGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTcpLCBheGlzLnRpdGxlLng9IGVsZW1lbnRfdGV4dChzaXplPTE1KSwgYXhpcy50aXRsZS55PSBlbGVtZW50X3RleHQoc2l6ZT0xNSksIGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikKICAKcDIgPC0gCiAgZ2dwbG90KHBtMl9Db3JkX1BSRURPX25fY29lZiwgYWVzKHkgPSB2YXJpYWJsZSwgeD1tZWRpYW4pKSsKICBnZW9tX3BvaW50KG1hcHBpbmcgPSBnZ3Bsb3QyOjphZXMoeSA9IHZhcmlhYmxlLCBzaXplID1ub25femVybywgYWxwaGEgPSBub25femVybywgY29sb3IgPSBub25femVybykpKwogIHNjYWxlX2NvbG9yX2dyYWRpZW50MihoaWdoID0gJ2dyZWVuJywgbWlkID0gInB1cnBsZSIsIGxvdyA9ICJibGFjayIsIG1pZHBvaW50ID01MCwgbGltaXRzPWMoMCwxMDApKSsKICBzY2FsZV9hbHBoYShndWlkZSA9ICdub25lJykrCiAgc2NhbGVfc2l6ZShndWlkZSA9ICdub25lJykrCiAgZ2VvbV9wb2ludCgpKwogIGdlb21fZXJyb3JiYXIoYWVzKHkgPSB2YXJpYWJsZSwgeG1pbiA9IGxjbCwgeG1heCA9IHVjbCksIHdpZHRoID0gMC4yKSsKICBsYWJzKHk9IiIsIHggPSAiXG5tZWRpYW4gJiA5NSUgQ0kgb2YgY29lZmZpY2llbnQgKG92ZXIgYm9vdHN0cmFwcykiLCBjb2xvcj0iJSIpKwogIHNjYWxlX3hfY29udGludW91cyhsaW1pdHM9YygtMC40LDAuNCksIGJyZWFrcz1jKC0uNCwtLjMsLS4yLCAtLjEsIDAsIC4xLCAuMiwgLjMsIC40KSkrCiAgc2NhbGVfeV9kaXNjcmV0ZShsYWJlbHM9IGMoImNoaWxkIHNleCAoZmVtYWxlKSIsICJiaXJ0aCB3ZWlnaHQiLCAiYmlydGggbGVuZ3RoIiwgImhlYWQgY2lyY3VtZmVyZW5jZSIsICJkZWxpdmVyeSBtb2RlIChhaWRlZCkiLCAiaW5kdWNlZCBsYWJvciAoeWVzKSIsICJwYXJpdHkgKGJpcnRoIGJlZm9yZSkiLCAibWF0ZXJuYWwgYWdlIiwgIm1hdGVybmFsIEJNSSIsICJtYXRlcm5hbCBoeXBlcnRlbnNpb24gKHllcykiLCAibWF0ZXJuYWwgZGlhYmV0ZXMgKHllcykiLCAibWF0ZXJuYWwgbWVudGFsIGRpc29yZGVycyAoeWVzKSIsICJtYXRlcm5hbCBzbW9raW5nICh5ZXMpIikpKwogIGdlb21fdmxpbmUoeGludGVyY2VwdD0wLCBsaW5ldHlwZT0iZGFzaGVkIikrCiAgIGdndGl0bGUoIm56ZXJvID0gNyIpKwogIHRoZW1lX2J3KCkrCiB0aGVtZSh0ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNyksIGF4aXMudGl0bGUueD0gZWxlbWVudF90ZXh0KHNpemU9MTUpLCBheGlzLnRpdGxlLnk9IGVsZW1lbnRfdGV4dChzaXplPTE1KSwgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplPTE1KSwgYXhpcy50ZXh0Lnk9ZWxlbWVudF9ibGFuaygpKQoKZzEgPC0gZ2dwbG90R3JvYihwMSkKZzIgPC0gZ2dwbG90R3JvYihwMikKZyA8LSBjYmluZChnMSwgZzIsIHNpemUgPSAibGFzdCIpCmckaGVpZ2h0cyA8LSB1bml0LnBtYXgoZzEkaGVpZ2h0cywgZzIkaGVpZ2h0cykKCnBuZyhmaWxlbmFtZT0iUmVzdWx0cy9GaWd1cmVzL2VsYXN0aWNOZXRfc2luZ2xlVGlzc3Vlcy9PdXRjb21lX21haW4vTW9kZWxfY29lZl9Db3JkX1BSRURPLnBuZyIsIHdpZHRoPTU4MDAsIGhlaWdodD0xNjAwLCByZXM9NDAwKQpncmlkLmRyYXcoZykKZGV2Lm9mZigpCmBgYAoKW3RvIHRoZSB0b3BdKCN0b3ApCgojIyBlbGFzdGljIG5ldCBQUkVETyA0NTBLIENvcmQgYmxvb2QgeyNlbGFzdGljbmV0Q29yZFBSRURPNDUwfSAgCm1haW4gbW9kZWwsIHdpdGhvdXQgYWxjb2hvbAoKYGBge3J9CmxvYWQoIklucHV0RGF0YS9DbG9ja0NhbGN1bGF0aW9uc0lucHV0L1JlZ19JbnB1dF9EYXRhX0NvcmRibG9vZF9QUkVETzQ1MEtfRUFBUl9ub05hX24uUmRhdGEiKQpgYGAKCgpgYGB7cn0KeXJjX21hdF9QUkVET19Db3JkNDUwX24gPC0gbWF0cml4KFJlZ19JbnB1dF9EYXRhX0NvcmRibG9vZF9QUkVETzQ1MEtfRUFBUl9ub05hX24kRUFBUl9Cb2hsaW4pCnhyY19tYXRfUFJFRE9fQ29yZDQ1MF9uIDwtIG1vZGVsLm1hdHJpeCggfiAuIC0gRUFBUl9Cb2hsaW4sIGRhdGEgPSBSZWdfSW5wdXRfRGF0YV9Db3JkYmxvb2RfUFJFRE80NTBLX0VBQVJfbm9OYV9uKVssIC0xXQp5cmNfbWF0X1BSRURPX3NjYWxlZF9Db3JkNDUwX24gPC0gc2NhbGUoeXJjX21hdF9QUkVET19Db3JkNDUwX24pCnhyY19tYXRfUFJFRE9fc2NhbGVkX0NvcmQ0NTBfbiA8LSBzY2FsZSh4cmNfbWF0X1BSRURPX0NvcmQ0NTBfbikKYGBgCgoKPCEtLSBzZXQgc2VlZCAtLT4KPCEtLSBgYGB7cn0gLS0+CjwhLS0gc2V0LnNlZWQoMjAyMCkgLS0+CjwhLS0gYGBgIC0tPgoKCjwhLS0gYGBge3IsIHdhcm5pbmc9Rn0gLS0+CjwhLS0gICBuYm9vdCA9IDEwMDAgLS0+Cgo8IS0tICAgc3RhcnRfdGltZSA8LSBTeXMudGltZSgpIC0tPgo8IS0tICAgYm9vdHN0cmFwc19Db3JkNDUwX1BSRURPX24gPC0gcmVwbGljYXRlKG5ib290LCB7IC0tPgo8IS0tICAgICByd3MgPC0gc2FtcGxlKDE6bnJvdyh4cmNfbWF0X1BSRURPX3NjYWxlZF9Db3JkNDUwX24pLCByZXBsYWNlID0gVFJVRSkgLS0+CjwhLS0gICAgIGVuc3IoeHJjX21hdF9QUkVET19zY2FsZWRfQ29yZDQ1MF9uW3J3cywgXSwgeXJjX21hdF9QUkVET19zY2FsZWRfQ29yZDQ1MF9uW3J3cywgXSwgc3RhbmRhcmRpemVkID0gRkFMU0UsIGZhbWlseT0iZ2F1c3NpYW4iLCBubGFtYmRhPTEwMCwgbmZvbGRzPTEwLCBhbHBoYT1jKDAuMCwwLjEsMC4yLDAuMywwLjQsMC41LDAuNiwwLjcsMC44LDAuOSwxLjApKSAtLT4KPCEtLSAgIH0sIC0tPgo8IS0tICAgc2ltcGxpZnkgPSBGQUxTRSkgLS0+Cgo8IS0tICAgZW5kX3RpbWUgPC0gU3lzLnRpbWUoKSAtLT4KPCEtLSAgIGVuZF90aW1lIC0gc3RhcnRfdGltZSAtLT4KCjwhLS0gYGBgIC0tPgoKPCEtLSBgYGB7cn0gLS0+CjwhLS0gc2F2ZShib290c3RyYXBzX0NvcmQ0NTBfUFJFRE9fbiwgZmlsZT0iSW5wdXREYXRhL0RhdGFfRWxhc3RpY05ldHMvYm9vdHN0cmFwc19Db3JkNDUwX1BSRURPX25fMTAwMC5SZGF0YSIpIC0tPgo8IS0tIGBgYCAtLT4KCgpgYGB7cn0KbG9hZCgiSW5wdXREYXRhL0RhdGFfRWxhc3RpY05ldHMvYm9vdHN0cmFwc19Db3JkNDUwX1BSRURPX25fMTAwMC5SZGF0YSIpCmBgYAoKYGBge3J9CnN1bW1hcmllc19Db3JkNDUwX1BSRURPX24gPC0KICBib290c3RyYXBzX0NvcmQ0NTBfUFJFRE9fbiAlPiUKICBsYXBwbHkoc3VtbWFyeSkgJT4lCiAgcmJpbmRsaXN0KGlkY29sID0gImJvb3RzdHJhcCIpCgpzdW1tYXJpZXNfQ29yZDQ1MF9QUkVET19uCmBgYAoKYGBge3J9CnN1bW1hcmllc19Db3JkNDUwX1BSRURPX25bLCAuU0RbY3ZtID09IG1pbihjdm0pXSwgYnkgPSBjKCJib290c3RyYXAiLCAibnplcm8iKV0gJT4lCiAgZ2dwbG90Mjo6Z2dwbG90KGRhdGEgPSAuKSArCiAgZ2dwbG90Mjo6YWVzKHggPSBuemVybywgeSA9IGN2bSwgZ3JvdXAgPSBib290c3RyYXApICsKICBnZ3Bsb3QyOjpnZW9tX3BvaW50KCkgKwogIGdncGxvdDI6Omdlb21fbGluZSgpKwogIGdncGxvdDI6OmxhYnMoeD0iXG5uemVybyIsIHk9ImN2bVxuIikrCiAgZ2dwbG90Mjo6dGhlbWUodGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTUpLCBheGlzLnRpdGxlLng9IGVsZW1lbnRfdGV4dChzaXplPTE1KSwgYXhpcy50aXRsZS55PSBlbGVtZW50X3RleHQoc2l6ZT0xNSkpKwogIGdncGxvdDI6OnRoZW1lX2J3KCkKYGBgCgoKYGBge3J9CnBuZyhmaWxlbmFtZT0iUmVzdWx0cy9GaWd1cmVzL2VsYXN0aWNOZXRfc2luZ2xlVGlzc3Vlcy9PdXRjb21lX21haW4vYm9vdHN0cmFwc19Db3JkNDUwLnBuZyIsIHdpZHRoPTIyMDAsIGhlaWdodD0xNDAwLCByZXM9MzAwKQpzdW1tYXJpZXNfQ29yZDQ1MF9QUkVET19uWywgLlNEW2N2bSA9PSBtaW4oY3ZtKV0sIGJ5ID0gYygiYm9vdHN0cmFwIiwgIm56ZXJvIildICU+JQogIGdncGxvdDI6OmdncGxvdChkYXRhID0gLikgKwogIGdncGxvdDI6OmFlcyh4ID0gbnplcm8sIHkgPSBjdm0sIGdyb3VwID0gYm9vdHN0cmFwKSArCiAgZ2dwbG90Mjo6Z2VvbV9wb2ludCgpICsKICBnZ3Bsb3QyOjpnZW9tX2xpbmUoKSsKICBnZ3Bsb3QyOjpsYWJzKHg9Ilxubnplcm8iLCB5PSJjdm1cbiIpKwogIGdncGxvdDI6OnRoZW1lKHRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE1KSwgYXhpcy50aXRsZS54PSBlbGVtZW50X3RleHQoc2l6ZT0xNSksIGF4aXMudGl0bGUueT0gZWxlbWVudF90ZXh0KHNpemU9MTUpKSsKICBnZ3Bsb3QyOjp0aGVtZV9idygpCmRldi5vZmYoKQpgYGAKCgoKPCEtLSBgYGB7ciwgd2FybmluZz1GQUxTRX0gLS0+CjwhLS0gIyBsb3dlc3QgY3ZtIGJ5IGJvb3RzdHJhcCBhbmQgbnplcm8gLS0+CjwhLS0gcG1fQ29yZDQ1MF9QUkVET19uIDwtIHN1bW1hcmllc19Db3JkNDUwX1BSRURPX25bLCAuU0RbY3ZtID09IG1pbihjdm0pXSwgYnkgPSBjKCJib290c3RyYXAiLCAibnplcm8iKV0gLS0+CjwhLS0gcG0yX0NvcmQ0NTBfUFJFRE9fbiA8LSBOVUxMIC0tPgoKPCEtLSBmb3IoaSBpbiBhcy5pbnRlZ2VyKHNlcSgxLCBucm93KHBtX0NvcmQ0NTBfUFJFRE9fbiksIGJ5ID0gMSkpKSB7IC0tPgo8IS0tICAgcG0yX0NvcmQ0NTBfUFJFRE9fbiA8LSByYmluZChwbTJfQ29yZDQ1MF9QUkVET19uLCAtLT4KPCEtLSAgICAgICAgICAgICAgICBjYmluZChwbV9Db3JkNDUwX1BSRURPX25baSwgXSwgLS0+CjwhLS0gICAgICAgICAgICAgICAgdChhcy5tYXRyaXgoY29lZihib290c3RyYXBzX0NvcmQ0NTBfUFJFRE9fbltbcG1fQ29yZDQ1MF9QUkVET19uW2ksIGJvb3RzdHJhcF1dXVtbcG1fQ29yZDQ1MF9QUkVET19uW2ksIGxfaW5kZXhdXV0sIHMgPSBwbV9Db3JkNDUwX1BSRURPX25baSwgbGFtYmRhXSkpKSAtLT4KPCEtLSAgICAgICAgICAgICAgICApIC0tPgo8IS0tICAgKSAtLT4KPCEtLSB9IC0tPgoKPCEtLSBwbTJfQ29yZDQ1MF9QUkVET19uIC0tPgo8IS0tIGBgYCAtLT4KCgo8IS0tIGBgYHtyfSAtLT4KPCEtLSAjIHNhdmUgInByZWZlcmFibGUgbW9kZWxzIiAtLT4KPCEtLSBzYXZlKHBtMl9Db3JkNDUwX1BSRURPX24sIGZpbGU9IklucHV0RGF0YS9EYXRhX0VsYXN0aWNOZXRzL3BtMl9Db3JkNDUwX1BSRURPX24uUmRhdGEiKSAtLT4KPCEtLSBgYGAgLS0+CgoKYGBge3J9CmxvYWQoIklucHV0RGF0YS9EYXRhX0VsYXN0aWNOZXRzL3BtMl9Db3JkNDUwX1BSRURPX24uUmRhdGEiKQojIGNvZWZmaWNpZW50IHZhbHVlcyBmb3IgdGhlIG1vZGVscyB3aXRoIHNtYWxsZXN0IGN2bSBieSBudW1iZXIgb2Ygbm9uLWVyem8gY29lZmZpY2llbnRzIGFuZCBib290c3RyYXAKYGBgCgpgYGB7cn0KY3N1bW1hcnlfQ29yZDQ1MF9QUkVET19uIDwtIFJlZHVjZShmdW5jdGlvbih4LHkpIG1lcmdlKHggPSB4LCB5ID0geSwgYnkgPSAibnplcm8iKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0KHBtMl9Db3JkNDUwX1BSRURPX25bLCBsYXBwbHkoLlNELCBmdW5jdGlvbih4KSB7bWVhbih4ICE9IDApfSksIC5TRGNvbHMgPSBjKCJDaGlsZF9TZXhmZW1hbGUiLCAiQmlydGhfV2VpZ2h0IiwgIkJpcnRoX0xlbmd0aCIsICJIZWFkX0NpcmN1bWZlcmVuY2VfYXRfQmlydGgiLCAiRGVsaXZlcnlfTW9kZV9kaWNob3RvbWFpZGVkIiwgImluZHVjZWRsYWJvdXJZZXMiLCAiUGFyaXR5X2RpY2hvdG9tZ2l2ZW4gYmlydGggYmVmb3JlIiwgIk1hdGVybmFsX0FnZV8xOFBvcFJlZ2FuZEJSIiwgIk1hdGVybmFsX1ByZXByZWduYW5jeUJNSTE4b2N0MjhuZXciLCAibWF0ZXJuYWxfaHlwZXJ0ZW5zaW9uX2RpY2hvdG9taHlwZXJ0ZW5zaW9uIGluIGN1cnJlbnQgcHJlZ25hbmN5IiwgIm1hdGVybmFsX2RpYWJldGVzX2RpY2hvdG9tZGlhYmV0ZXMgaW4gY3VycmVudCBwcmVnbmFuY3kiLCAiTWF0ZXJuYWxfTWVudGFsX0Rpc29yZGVyc19CeV9DaGlsZGJpcnRoWWVzIiwgInNtb2tpbmdfZGljaG90b215ZXMiKSwgYnkgPSBuemVyb10KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbTJfQ29yZDQ1MF9QUkVET19uWywgLihtZWFuX2N2bSA9IG1lYW4oY3ZtKSksIGJ5ID0gbnplcm9dLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbTJfQ29yZDQ1MF9QUkVET19uWywgLihtZWRpYW5fY3ZtID0gbWVkaWFuKGN2bSkpLCBieSA9IG56ZXJvXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSlbb3JkZXIobnplcm8pXQoKY3N1bW1hcnlfQ29yZDQ1MF9QUkVET19uCmBgYAoKCmBgYHtyfQpnMV9Db3JkNDUwX1BSRURPX24gPC0KICBjc3VtbWFyeV9Db3JkNDUwX1BSRURPX24gJT4lCiAgbWVsdChpZC52YXJzID0gYygibnplcm8iLCAibWVhbl9jdm0iLCAibWVkaWFuX2N2bSIpKSAlPiUKICBnZ3Bsb3QyOjpnZ3Bsb3QoLikgKwogIGdncGxvdDI6OnRoZW1lX2J3KCkgKwogIGdncGxvdDI6OmFlcyh4ID0gbnplcm8pICsKICBnZ3Bsb3QyOjpnZW9tX3BvaW50KG1hcHBpbmcgPSBnZ3Bsb3QyOjphZXMoeSA9IHZhcmlhYmxlLCBzaXplID0gdmFsdWUsIGFscGhhID0gdmFsdWUsIGNvbG9yID0gdmFsdWUqMTAwKSkgKwogIGdncGxvdDI6OnNjYWxlX2NvbG9yX2dyYWRpZW50MihoaWdoID0gJ2dyZWVuJywgbWlkID0gInB1cnBsZSIsIGxvdyA9ICJibGFjayIsIG1pZHBvaW50ID01MCkrCiAgZ2dwbG90Mjo6c2NhbGVfYWxwaGEoZ3VpZGUgPSAnbm9uZScpKwogIGdncGxvdDI6OnNjYWxlX3NpemUoZ3VpZGUgPSAnbm9uZScpKwogIGdncGxvdDI6OnNjYWxlX3lfZGlzY3JldGUobGFiZWxzPSBjKCJjaGlsZCBzZXgiLCAiYmlydGggd2VpZ2h0IiwgImJpcnRoIGxlbmd0aCIsICJoZWFkIGNpcmN1bWZlcmVuY2UiLCAiZGVsaXZlcnkgbW9kZSIsICJpbmR1Y2VkIGxhYm9yIiwgInBhcml0eSIsICJtYXRlcm5hbCBhZ2UiLCAibWF0ZXJuYWwgQk1JIiwgIm1hdGVybmFsIGh5cGVydGVuc2lvbiIsICJtYXRlcm5hbCBkaWFiZXRlcyIsICJtYXRlcm5hbCBtZW50YWwgZGlzb3JkZXJzIiwgIm1hdGVybmFsIHNtb2tpbmciKSkrCiAgZ2dwbG90Mjo6c2NhbGVfeF9jb250aW51b3VzKGJyZWFrcz0wOjE0LCBsYWJlbHM9KSsKICBnZ3Bsb3QyOjpsYWJzKHk9InByZWRpY3RvclxuIiwgeCA9ICJcbm51bWJlciBvZiBub24temVybyBjb2VmZmljaWVudHMiLCBjb2xvcj0iJSIpKwogIGdncGxvdDI6OnRoZW1lKHRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE1KSwgYXhpcy50aXRsZS54PSBlbGVtZW50X3RleHQoc2l6ZT0xNSksIGF4aXMudGl0bGUueT0gZWxlbWVudF90ZXh0KHNpemU9MTUpKQogIAoKZzJfQ29yZDQ1MF9QUkVET19uIDwtCiAgY3N1bW1hcnlfQ29yZDQ1MF9QUkVET19uICU+JQogIGdncGxvdDI6OmdncGxvdCguKSArCiAgZ2dwbG90Mjo6dGhlbWVfYncoKSArCiAgZ2dwbG90Mjo6YWVzKHggPSBuemVybywgeSA9IG1lZGlhbl9jdm0pICsKICBnZ3Bsb3QyOjpnZW9tX3BvaW50KCkgKyBnZ3Bsb3QyOjpnZW9tX2xpbmUoKSsKICBnZ3Bsb3QyOjpsYWJzKHk9Im1lZGlhbiBjdm0iLCB4ID0gIm56ZXJvIikrCiAgZ2dwbG90Mjo6c2NhbGVfeF9jb250aW51b3VzKGJyZWFrcz0wOjE0LCBsYWJlbHM9KSsKICBnZ3Bsb3QyOjp0aGVtZShheGlzLnRleHQ9ZWxlbWVudF90ZXh0KHNpemU9MTUpLGF4aXMudGl0bGU9ZWxlbWVudF90ZXh0KHNpemU9MTgpKQoKZ3JpZEV4dHJhOjpncmlkLmFycmFuZ2UoZzFfQ29yZDQ1MF9QUkVET19uLCBnMl9Db3JkNDUwX1BSRURPX24sIG5jb2wgPSAxKQpnMV9Db3JkNDUwX1BSRURPX24KYGBgCgoKYGBge3J9CnBuZyhmaWxlbmFtZT0iUmVzdWx0cy9GaWd1cmVzL2VsYXN0aWNOZXRfc2luZ2xlVGlzc3Vlcy9PdXRjb21lX21haW4vTW9kZWxfQ29yZDQ1MF9QUkVETy5wbmciLCB3aWR0aD0yODAwLCBoZWlnaHQ9MTQwMCwgcmVzPTQwMCkKZzFfQ29yZDQ1MF9QUkVET19uCmRldi5vZmYoKQpgYGAKYGBge3J9CnBuZyhmaWxlbmFtZT0iUmVzdWx0cy9GaWd1cmVzL2VsYXN0aWNOZXRfc2luZ2xlVGlzc3Vlcy9PdXRjb21lX21haW4vYm9vdHN0cmFwTW9kZWxzX0NvcmQ0NTBfUFJFRE8ucG5nIiwgd2lkdGg9MjgwMCwgaGVpZ2h0PTE0MDAsIHJlcz0zMDApCmdyaWRFeHRyYTo6Z3JpZC5hcnJhbmdlKGcxX0NvcmQ0NTBfUFJFRE9fbiwgZzJfQ29yZDQ1MF9QUkVET19uLCBuY29sID0gMSkKZGV2Lm9mZigpCmBgYAoKYGBge3J9CmVsYm93X2ZpbmRlcihjc3VtbWFyeV9Db3JkNDUwX1BSRURPX24kbnplcm8sIGNzdW1tYXJ5X0NvcmQ0NTBfUFJFRE9fbiRtZWRpYW5fY3ZtKQoKbnplcm9faW5kaWNlc19Db3JkNDUwIDwtIGRhdGEuZnJhbWUodChlbGJvd19maW5kZXIoY3N1bW1hcnlfQ29yZDQ1MF9QUkVET19uJG56ZXJvLCBjc3VtbWFyeV9Db3JkNDUwX1BSRURPX24kbWVkaWFuX2N2bSkpKQpjb2xuYW1lcyhuemVyb19pbmRpY2VzX0NvcmQ0NTApIDwtIGMoIngiLCAieSIpCnJvd25hbWVzKG56ZXJvX2luZGljZXNfQ29yZDQ1MCkgPC0gTlVMTApgYGAKCmBgYHtyfQpuemVyb19maW5hbF9Db3JkNDUwX3ByZWRvIDwtIDYKYGBgCgpgYGB7cn0KY3N1bW1hcnlfQ29yZDQ1MF9QUkVET19uW256ZXJvICVpbiUgbnplcm9fZmluYWxfQ29yZDQ1MF9wcmVkb10KYGBgCgpgYGB7cn0Kc3VtbWFyeV9Db3JkNDUwX1BSRURPX25fZmluYWxuemVybyA8LSBjc3VtbWFyeV9Db3JkNDUwX1BSRURPX25bbnplcm8gJWluJSBuemVyb19maW5hbF9Db3JkNDUwX3ByZWRvXQpzaWdfdmFyX25hbWVzX0NvcmQ0NTBfUFJFRE9fbl9maW5hbG56ZXJvIDwtIEZpbHRlcihmdW5jdGlvbih4KSBhbnkoeCA+IDAuNzUpLCBzdW1tYXJ5X0NvcmQ0NTBfUFJFRE9fbl9maW5hbG56ZXJvWywhYygibnplcm8iLCAibWVhbl9jdm0iLCAibWVkaWFuX2N2bSIpXSkgJT4lIGNvbG5hbWVzKCkKY29sbmFtZXMoc3VtbWFyeV9Db3JkNDUwX1BSRURPX25fZmluYWxuemVybykgPC0gYygibm9uLXplcm8iLCAiY2hpbGQgc2V4IChmZW1hbGUpIiwgImJpcnRoIHdlaWdodCIsICJiaXJ0aCBsZW5ndGgiLCAiaGVhZCBjaXJjdW1mZXJlbmNlIiwgImRlbGl2ZXJ5IG1vZGUgKGFpZGVkKSIsICJpbmR1Y2VkIGxhYm9yICh5ZXMpIiwgInBhcml0eSAoYmlydGggYmVmb3JlKSIsICJtYXRlcm5hbCBhZ2UiLCAibWF0ZXJuYWwgQk1JIiwgIm1hdGVybmFsIGh5cGVydGVuc2lvbiAoeWVzKSIsICJtYXRlcm5hbCBkaWFiZXRlcyAoeWVzKSIsICJtYXRlcm5hbCBtZW50YWwgZGlzb3JkZXJzICh5ZXMpIiwgIm1hdGVybmFsIHNtb2tpbmcgKHllcykiLCAibWVhbiBjdm0iLCAibWVkaWFuIGN2bSIpCnN1bW1hcnlfQ29yZDQ1MF9QUkVET19uX2ZpbmFsbnplcm9UIDwtIGFzLmRhdGEuZnJhbWUodChzdW1tYXJ5X0NvcmQ0NTBfUFJFRE9fbl9maW5hbG56ZXJvWywtYygibm9uLXplcm8iLCAibWVkaWFuIGN2bSIsICJtZWFuIGN2bSIpXSkpCnN1bW1hcnlfQ29yZDQ1MF9QUkVET19uX2ZpbmFsbnplcm9UJHZhcmlhYmxlIDwtIHJvd25hbWVzKHN1bW1hcnlfQ29yZDQ1MF9QUkVET19uX2ZpbmFsbnplcm9UKQpyb3duYW1lcyhzdW1tYXJ5X0NvcmQ0NTBfUFJFRE9fbl9maW5hbG56ZXJvVCkgPC0gTlVMTApuYW1lcyhzdW1tYXJ5X0NvcmQ0NTBfUFJFRE9fbl9maW5hbG56ZXJvVClbbmFtZXMoc3VtbWFyeV9Db3JkNDUwX1BSRURPX25fZmluYWxuemVyb1QpID09ICdWMSddIDwtICdwZXJjZW50JwpzdW1tYXJ5X0NvcmQ0NTBfUFJFRE9fbl9maW5hbG56ZXJvVCA8LSBzdW1tYXJ5X0NvcmQ0NTBfUFJFRE9fbl9maW5hbG56ZXJvVFtvcmRlcihzdW1tYXJ5X0NvcmQ0NTBfUFJFRE9fbl9maW5hbG56ZXJvVCRwZXJjZW50KSxdCgpzdW1tYXJ5X0NvcmQ0NTBfUFJFRE9fbl9maW5hbG56ZXJvVCRudW1iZXIgPC0gc2VxKDEsIGxlbmd0aChzdW1tYXJ5X0NvcmQ0NTBfUFJFRE9fbl9maW5hbG56ZXJvVCR2YXJpYWJsZSkpCmBgYAoKYGBge3IsIGZpZy53aWR0aD04fQpwZXJjX3ZhcnNfQ29yZDQ1MF9QUkVET19uIDwtIAogIGdncGxvdChzdW1tYXJ5X0NvcmQ0NTBfUFJFRE9fbl9maW5hbG56ZXJvVCwgYWVzKHJlb3JkZXIodmFyaWFibGUsIHBlcmNlbnQpLCBwZXJjZW50LCBncm91cD0xKSkrCiAgZ2VvbV9wb2ludCgpKyBnZW9tX2xpbmUoKSsKICB5bGFiKCJcbiUgb2NjdXJlbmNlIGluIG1vZGVscyB3aXRoIG56ZXJvIGNvZWZmaWNpZW50cyA9IDkgICAgIikrCiAgc2NhbGVfeV9jb250aW51b3VzKGJyZWFrcz1jKDAuMSwwLjIsMC4zLDAuNCwwLjUsMC42LDAuNywwLjgsMC45KSkrCiAgeGxhYigicHJlZGljdG9yXG4iKSsKICBjb29yZF9mbGlwKCkrCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0PTAuNzUsIGxpbmV0eXBlPSJkb3R0ZWQiKSsKICB0aGVtZV9idygpKwogIHRoZW1lKHRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE1KSwgYXhpcy50aXRsZS54PSBlbGVtZW50X3RleHQoc2l6ZT0xNSksIGF4aXMudGl0bGUueT0gZWxlbWVudF90ZXh0KHNpemU9MTUpKQoKcGVyY192YXJzX0NvcmQ0NTBfUFJFRE9fbgoKIyBkZWNpZGUgZm9yIGN1dC1vZmYgJSAtPiBoZXJlIC43NQoKRmlsdGVyKGZ1bmN0aW9uKHgpIGFueSh4ID4gMC43NSksIHN1bW1hcnlfQ29yZDQ1MF9QUkVET19uX2ZpbmFsbnplcm9bLCFjKCJub24temVybyIsICJtZWFuIGN2bSIsICJtZWRpYW4gY3ZtIildKQoKYGBgCgoKYGBge3J9CnBtMl9Db3JkNDUwX1BSRURPX25fY29lZiA8LQogIGRjYXN0KHBtMl9Db3JkNDUwX1BSRURPX25bLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzLmxpc3QodW5saXN0KAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwcGx5KC5TRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbih4KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5IDwtIHVubmFtZShxdWFudGlsZSh4W3ggIT0gMF0sIHByb2JzID0gYygwLjAyNSwgMC45NzUpKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3QoIm5vbl96ZXJvIiA9IDEwMCAqIG1lYW4oeCAhPSAwKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGNsID0geVsxXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWNsID0geVsyXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGggPSBkaWZmKHkpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYW4gPSBtZWRpYW4oeFt4IT0gMF0pKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLlNEY29scyA9IGMoIkNoaWxkX1NleGZlbWFsZSIsICJCaXJ0aF9XZWlnaHQiLCAiQmlydGhfTGVuZ3RoIiwgIkhlYWRfQ2lyY3VtZmVyZW5jZV9hdF9CaXJ0aCIsICJEZWxpdmVyeV9Nb2RlX2RpY2hvdG9tYWlkZWQiLCAiaW5kdWNlZGxhYm91clllcyIsICJQYXJpdHlfZGljaG90b21naXZlbiBiaXJ0aCBiZWZvcmUiLCAiTWF0ZXJuYWxfQWdlXzE4UG9wUmVnYW5kQlIiLCAiTWF0ZXJuYWxfUHJlcHJlZ25hbmN5Qk1JMThvY3QyOG5ldyIsICJtYXRlcm5hbF9oeXBlcnRlbnNpb25fZGljaG90b21oeXBlcnRlbnNpb24gaW4gY3VycmVudCBwcmVnbmFuY3kiLCAibWF0ZXJuYWxfZGlhYmV0ZXNfZGljaG90b21kaWFiZXRlcyBpbiBjdXJyZW50IHByZWduYW5jeSIsICJNYXRlcm5hbF9NZW50YWxfRGlzb3JkZXJzX0J5X0NoaWxkYmlydGhZZXMiLCAic21va2luZ19kaWNob3RvbXllcyIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5ID0gbnplcm9dW29yZGVyKG56ZXJvKV0gJT4lCiAgICAgICAgICBtZWx0KGlkLnZhciA9ICJuemVybyIpICU+JQogICAgICAgICAgLlssIG1ldHJpYyA6PSBzdWIoIl4uK1xcLiguKykkIiwgIlxcMSIsIHZhcmlhYmxlKV0gJT4lCiAgICAgICAgICAuWywgdmFyaWFibGUgOj0gc3ViKCJeKC4rKVxcLi4rJCIsICJcXDEiLCB2YXJpYWJsZSldICU+JQogICAgICAgICAgLltuemVybyA9PW56ZXJvX2ZpbmFsX0NvcmQ0NTBfcHJlZG9dLCBuemVybysgdmFyaWFibGUgfiBtZXRyaWMsIHZhbHVlLnZhcj0idmFsdWUiKQoKIyBnZXQgZGVzaXJlZCBvcmRlciBvZiBwcmVkaWN0b3JzCnBtMl9Db3JkNDUwX1BSRURPX25fY29lZiA8LQogIHBtMl9Db3JkNDUwX1BSRURPX25fY29lZlttYXRjaChjKCJDaGlsZF9TZXhmZW1hbGUiLCAiQmlydGhfV2VpZ2h0IiwgIkJpcnRoX0xlbmd0aCIsICJIZWFkX0NpcmN1bWZlcmVuY2VfYXRfQmlydGgiLCAiRGVsaXZlcnlfTW9kZV9kaWNob3RvbWFpZGVkIiwgImluZHVjZWRsYWJvdXJZZXMiLCAiUGFyaXR5X2RpY2hvdG9tZ2l2ZW4gYmlydGggYmVmb3JlIiwgIk1hdGVybmFsX0FnZV8xOFBvcFJlZ2FuZEJSIiwgIk1hdGVybmFsX1ByZXByZWduYW5jeUJNSTE4b2N0MjhuZXciLCAibWF0ZXJuYWxfaHlwZXJ0ZW5zaW9uX2RpY2hvdG9taHlwZXJ0ZW5zaW9uIGluIGN1cnJlbnQgcHJlZ25hbmN5IiwgIm1hdGVybmFsX2RpYWJldGVzX2RpY2hvdG9tZGlhYmV0ZXMgaW4gY3VycmVudCBwcmVnbmFuY3kiLCAiTWF0ZXJuYWxfTWVudGFsX0Rpc29yZGVyc19CeV9DaGlsZGJpcnRoWWVzIiwgInNtb2tpbmdfZGljaG90b215ZXMiKSwgcG0yX0NvcmQ0NTBfUFJFRE9fbl9jb2VmJHZhcmlhYmxlKSxdCnBtMl9Db3JkNDUwX1BSRURPX25fY29lZiR2YXJpYWJsZSA8LSBmYWN0b3IocG0yX0NvcmQ0NTBfUFJFRE9fbl9jb2VmJHZhcmlhYmwsIGxldmVscz11bmlxdWUocG0yX0NvcmQ0NTBfUFJFRE9fbl9jb2VmJHZhcmlhYmxlKSkKCmBgYAoKYGBge3J9CndyaXRlX3hsc3gocG0yX0NvcmQ0NTBfUFJFRE9fbl9jb2VmLCJSZXN1bHRzL1RhYmxlcy9Db2VmZmljaWVudHNfQ29yZDQ1MF9QUkVETy54bHN4IikKYGBgCgpgYGB7cn0KY29lZl9Db3JkNDUwX1BSRURPX24gPC0gCiAgZ2dwbG90KHBtMl9Db3JkNDUwX1BSRURPX25fY29lZiwgYWVzKHkgPSB2YXJpYWJsZSwgeD1tZWRpYW4pKSsKICBnZW9tX3BvaW50KG1hcHBpbmcgPSBnZ3Bsb3QyOjphZXMoeSA9IHZhcmlhYmxlLCBzaXplID1ub25femVybywgYWxwaGEgPSBub25femVybywgY29sb3IgPSBub25femVybykpKwogIHNjYWxlX2NvbG9yX2dyYWRpZW50MihoaWdoID0gJ2dyZWVuJywgbWlkID0gInB1cnBsZSIsIGxvdyA9ICJibGFjayIsIG1pZHBvaW50ID01MCwgbGltaXRzPWMoMCwxMDApKSsKICBzY2FsZV9hbHBoYShndWlkZSA9ICdub25lJykrCiAgc2NhbGVfc2l6ZShndWlkZSA9ICdub25lJykrCiAgZ2VvbV9wb2ludCgpKwogIGdlb21fZXJyb3JiYXIoYWVzKHkgPSB2YXJpYWJsZSwgeG1pbiA9IGxjbCwgeG1heCA9IHVjbCksIHdpZHRoID0gMC4yKSsKICBsYWJzKHk9InByZWRpY3RvciIsIHggPSAiXG5tZWRpYW4gJiA5NSUgQ0kgb2YgY29lZmZpY2llbnQgKG92ZXIgYm9vdHN0cmFwcykiLCBjb2xvcj0iJSIpKwogIHNjYWxlX3hfY29udGludW91cyhsaW1pdHM9YygtMC40LDAuNCksIGJyZWFrcz1jKC0uNCwtLjMsLS4yLCAtLjEsIDAsIC4xLCAuMiwgLjMsIC40KSkrCiAgc2NhbGVfeV9kaXNjcmV0ZShsYWJlbHM9IGMoImNoaWxkIHNleCAoZmVtYWxlKSIsICJiaXJ0aCB3ZWlnaHQiLCAiYmlydGggbGVuZ3RoIiwgImhlYWQgY2lyY3VtZmVyZW5jZSIsICJkZWxpdmVyeSBtb2RlIChhaWRlZCkiLCAiaW5kdWNlZCBsYWJvciAoeWVzKSIsICJwYXJpdHkgKGJpcnRoIGJlZm9yZSkiLCAibWF0ZXJuYWwgYWdlIiwgIm1hdGVybmFsIEJNSSIsICJtYXRlcm5hbCBoeXBlcnRlbnNpb24gKHllcykiLCAibWF0ZXJuYWwgZGlhYmV0ZXMgKHllcykiLCAibWF0ZXJuYWwgbWVudGFsIGRpc29yZGVycyAoeWVzKSIsICJtYXRlcm5hbCBzbW9raW5nICh5ZXMpIikpKwogIGdlb21fdmxpbmUoeGludGVyY2VwdD0wLCBsaW5ldHlwZT0iZGFzaGVkIikrCiAgdGhlbWVfYncoKSsKICB0aGVtZSh0ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNSksIGF4aXMudGl0bGUueD0gZWxlbWVudF90ZXh0KHNpemU9MTUpLCBheGlzLnRpdGxlLnk9IGVsZW1lbnRfdGV4dChzaXplPTE1KSkKCgpjb2VmX0NvcmQ0NTBfUFJFRE9fbgpgYGAKCmBgYHtyfQpwbmcoZmlsZW5hbWU9IlJlc3VsdHMvRmlndXJlcy9lbGFzdGljTmV0X3NpbmdsZVRpc3N1ZXMvT3V0Y29tZV9tYWluL2NvZWZfQ29yZDQ1MF9QUkVETy5wbmciLCAgd2lkdGg9MjgwMCwgaGVpZ2h0PTE0MDAsIHJlcz00MDApCmNvZWZfQ29yZDQ1MF9QUkVET19uCmRldi5vZmYoKQpgYGAKCgpgYGB7cn0KcDEgPC0KICBjc3VtbWFyeV9Db3JkNDUwX1BSRURPX24gJT4lCiAgbWVsdChpZC52YXJzID0gYygibnplcm8iLCAibWVhbl9jdm0iLCAibWVkaWFuX2N2bSIpKSAlPiUKICBnZ3Bsb3QyOjpnZ3Bsb3QoLikgKwogIGdncGxvdDI6OnRoZW1lX2J3KCkgKwogIGdncGxvdDI6OmFlcyh4ID0gbnplcm8pICsKICBnZ3Bsb3QyOjpnZW9tX3BvaW50KG1hcHBpbmcgPSBnZ3Bsb3QyOjphZXMoeSA9IHZhcmlhYmxlLCBzaXplID0gdmFsdWUsIGFscGhhID0gdmFsdWUsIGNvbG9yID0gdmFsdWUqMTAwKSkgKwogIGdncGxvdDI6OnNjYWxlX2NvbG9yX2dyYWRpZW50MihoaWdoID0gJ2dyZWVuJywgbWlkID0gInB1cnBsZSIsIGxvdyA9ICJibGFjayIsIG1pZHBvaW50ID01MCkrCiAgZ2dwbG90Mjo6c2NhbGVfYWxwaGEoZ3VpZGUgPSAnbm9uZScpKwogIGdncGxvdDI6OnNjYWxlX3NpemUoZ3VpZGUgPSAnbm9uZScpKwogIGdncGxvdDI6OnNjYWxlX3lfZGlzY3JldGUobGFiZWxzPSBjKCJjaGlsZCBzZXggKGZlbWFsZSkiLCAiYmlydGggd2VpZ2h0IiwgImJpcnRoIGxlbmd0aCIsICJoZWFkIGNpcmN1bWZlcmVuY2UiLCAiZGVsaXZlcnkgbW9kZSAoYWlkZWQpIiwgImluZHVjZWQgbGFib3IgKHllcykiLCAicGFyaXR5IChiaXJ0aCBiZWZvcmUpIiwgIm1hdGVybmFsIGFnZSIsICJtYXRlcm5hbCBCTUkiLCAibWF0ZXJuYWwgaHlwZXJ0ZW5zaW9uICh5ZXMpIiwgIm1hdGVybmFsIGRpYWJldGVzICh5ZXMpIiwgIm1hdGVybmFsIG1lbnRhbCBkaXNvcmRlcnMgKHllcykiLCAibWF0ZXJuYWwgc21va2luZyAoeWVzKSIpKSsKICBnZ3Bsb3QyOjpzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzPTA6MTQsIGxhYmVscz0pKwogIGdncGxvdDI6OmxhYnMoeT0icHJlZGljdG9yXG4iLCB4ID0gIlxubnVtYmVyIG9mIG5vbi16ZXJvIGNvZWZmaWNpZW50cyIsIGNvbG9yPSIlIikrCiAgZ2dwbG90Mjo6dGhlbWUodGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTcpLCBheGlzLnRpdGxlLng9IGVsZW1lbnRfdGV4dChzaXplPTE1KSwgYXhpcy50aXRsZS55PSBlbGVtZW50X3RleHQoc2l6ZT0xNSksIGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikKICAKcDIgPC0gCiAgZ2dwbG90KHBtMl9Db3JkNDUwX1BSRURPX25fY29lZiwgYWVzKHkgPSB2YXJpYWJsZSwgeD1tZWRpYW4pKSsKICBnZW9tX3BvaW50KG1hcHBpbmcgPSBnZ3Bsb3QyOjphZXMoeSA9IHZhcmlhYmxlLCBzaXplID1ub25femVybywgYWxwaGEgPSBub25femVybywgY29sb3IgPSBub25femVybykpKwogIHNjYWxlX2NvbG9yX2dyYWRpZW50MihoaWdoID0gJ2dyZWVuJywgbWlkID0gInB1cnBsZSIsIGxvdyA9ICJibGFjayIsIG1pZHBvaW50ID01MCwgbGltaXRzPWMoMCwxMDApKSsKICBzY2FsZV9hbHBoYShndWlkZSA9ICdub25lJykrCiAgc2NhbGVfc2l6ZShndWlkZSA9ICdub25lJykrCiAgZ2VvbV9wb2ludCgpKwogIGdlb21fZXJyb3JiYXIoYWVzKHkgPSB2YXJpYWJsZSwgeG1pbiA9IGxjbCwgeG1heCA9IHVjbCksIHdpZHRoID0gMC4yKSsKICBsYWJzKHk9IiIsIHggPSAiXG5tZWRpYW4gJiA5NSUgQ0kgb2YgY29lZmZpY2llbnQgKG92ZXIgYm9vdHN0cmFwcykiLCBjb2xvcj0iJSIpKwogIHNjYWxlX3hfY29udGludW91cyhsaW1pdHM9YygtMC40LDAuNCksIGJyZWFrcz1jKC0uNCwtLjMsLS4yLCAtLjEsIDAsIC4xLCAuMiwgLjMsIC40KSkrCiAgc2NhbGVfeV9kaXNjcmV0ZShsYWJlbHM9IGMoImNoaWxkIHNleCAoZmVtYWxlKSIsICJiaXJ0aCB3ZWlnaHQiLCAiYmlydGggbGVuZ3RoIiwgImhlYWQgY2lyY3VtZmVyZW5jZSIsICJkZWxpdmVyeSBtb2RlIChhaWRlZCkiLCAiaW5kdWNlZCBsYWJvciAoeWVzKSIsICJwYXJpdHkgKGJpcnRoIGJlZm9yZSkiLCAibWF0ZXJuYWwgYWdlIiwgIm1hdGVybmFsIEJNSSIsICJtYXRlcm5hbCBoeXBlcnRlbnNpb24gKHllcykiLCAibWF0ZXJuYWwgZGlhYmV0ZXMgKHllcykiLCAibWF0ZXJuYWwgbWVudGFsIGRpc29yZGVycyAoeWVzKSIsICJtYXRlcm5hbCBzbW9raW5nICh5ZXMpIikpKwogIGdlb21fdmxpbmUoeGludGVyY2VwdD0wLCBsaW5ldHlwZT0iZGFzaGVkIikrCiAgIGdndGl0bGUoIm56ZXJvID0gNiIpKwogIHRoZW1lX2J3KCkrCiB0aGVtZSh0ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNyksIGF4aXMudGl0bGUueD0gZWxlbWVudF90ZXh0KHNpemU9MTUpLCBheGlzLnRpdGxlLnk9IGVsZW1lbnRfdGV4dChzaXplPTE1KSwgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplPTE1KSwgYXhpcy50ZXh0Lnk9ZWxlbWVudF9ibGFuaygpKQoKZzEgPC0gZ2dwbG90R3JvYihwMSkKZzIgPC0gZ2dwbG90R3JvYihwMikKZyA8LSBjYmluZChnMSwgZzIsIHNpemUgPSAibGFzdCIpCmckaGVpZ2h0cyA8LSB1bml0LnBtYXgoZzEkaGVpZ2h0cywgZzIkaGVpZ2h0cykKCnBuZyhmaWxlbmFtZT0iUmVzdWx0cy9GaWd1cmVzL2VsYXN0aWNOZXRfc2luZ2xlVGlzc3Vlcy9PdXRjb21lX21haW4vTW9kZWxfY29lZl9Db3JkNDUwX1BSRURPLnBuZyIsIHdpZHRoPTU4MDAsIGhlaWdodD0xNjAwLCByZXM9NDAwKQpncmlkLmRyYXcoZykKZGV2Lm9mZigpCmBgYAoKYGBge3J9CnJtKGxpc3QgPSBzZXRkaWZmKGxzKCksIGxzZi5zdHIoKSkpCmBgYAoKW3RvIHRoZSB0b3BdKCN0b3ApIAoKIyBDcm9zcy1UaXNzdWVzCgojIyBDb3JyZWxhdGlvbnMgRE5BbUdBIHsjY29yVGlzc3Vlc0ROQW1HQX0gIApgYGB7cn0KbG9hZChmaWxlPSAiSW5wdXREYXRhL0Nsb2NrQ2FsY3VsYXRpb25zSW5wdXQvRGF0YV9DVlNfSVRVLlJkYXRhIikKbG9hZChmaWxlPSAiSW5wdXREYXRhL0Nsb2NrQ2FsY3VsYXRpb25zSW5wdXQvRGF0YV9Db3JkX0lUVS5SZGF0YSIpCmxvYWQoZmlsZT0gIklucHV0RGF0YS9DbG9ja0NhbGN1bGF0aW9uc0lucHV0L0RhdGFfUGxhY2VudGFfSVRVLlJkYXRhIikKbG9hZChmaWxlPSJJbnB1dERhdGEvQ2xvY2tDYWxjdWxhdGlvbnNJbnB1dC9EYXRhX0Z1bGxfSVRVLlJkYXRhIikgIyBkYXRhIHBlcnNvbnMgd2l0aCBhbGwgbWVhc3VyZW1lbnQgcG9pbnRzIGF2YWlsYWJsZQpsb2FkKGZpbGU9IklucHV0RGF0YS9DbG9ja0NhbGN1bGF0aW9uc0lucHV0L0RhdGFfQ29yZF9QbGFjZW50YV9JVFUuUmRhdGEiKQpsb2FkKGZpbGU9IklucHV0RGF0YS9DbG9ja0NhbGN1bGF0aW9uc0lucHV0L0RhdGFfQ1ZTX1BsYWNlbnRhX0lUVS5SZGF0YSIpCmxvYWQoZmlsZT0iSW5wdXREYXRhL0Nsb2NrQ2FsY3VsYXRpb25zSW5wdXQvRGF0YV9DVlNfQ29yZF9JVFUuUmRhdGEiKQpsb2FkKGZpbGU9IklucHV0RGF0YS9DbG9ja0NhbGN1bGF0aW9uc0lucHV0L0RhdGFfSVRVX2FsbC5SZGF0YSIpICMgYWxsIHBlcnNvbnMgdG9nZXRoZXIgaW4gb25lIGRhdGEgZnJhbWUKCmxvYWQoZmlsZT0gIklucHV0RGF0YS9DbG9ja0NhbGN1bGF0aW9uc0lucHV0L0RhdGFfUGxhY2VudGFfbWFsZV9JVFUuUmRhdGEiKQpsb2FkKGZpbGU9ICJJbnB1dERhdGEvQ2xvY2tDYWxjdWxhdGlvbnNJbnB1dC9EYXRhX1BsYWNlbnRhX2ZlbWFsZV9JVFUuUmRhdGEiKQoKbG9hZChmaWxlPSJJbnB1dERhdGEvQ2xvY2tDYWxjdWxhdGlvbnNJbnB1dC9EYXRhX1BSRURPXzQ1MEtjb3JkLlJkYXRhIikKbG9hZChmaWxlPSJJbnB1dERhdGEvQ2xvY2tDYWxjdWxhdGlvbnNJbnB1dC9EYXRhX1BSRURPX0VQSUNjb3JkLlJkYXRhIikKbG9hZChmaWxlPSJJbnB1dERhdGEvQ2xvY2tDYWxjdWxhdGlvbnNJbnB1dC9EYXRhX1BSRURPX0VQSUNwbGFjZW50YS5SZGF0YSIpCmxvYWQoZmlsZT0iSW5wdXREYXRhL0Nsb2NrQ2FsY3VsYXRpb25zSW5wdXQvRGF0YV9QUkVET19FUElDX0NvcmRfUGxhY2VudGEuUmRhdGEiKQpsb2FkKGZpbGU9IklucHV0RGF0YS9DbG9ja0NhbGN1bGF0aW9uc0lucHV0L0RhdGFfUFJFRE9fRVBJQ19hbGwuUmRhdGEiKSAjIGFsbCBwZXJzb25zIHdpdGggRVBJQyBkYXRhIHRvZ2V0aGVyIGluIG9uZSBkYXRhIGZyYW1lCgpsb2FkKGZpbGU9IklucHV0RGF0YS9DbG9ja0NhbGN1bGF0aW9uc0lucHV0L0RhdGFfUFJFRE9fUGxhY2VudGFfbWFsZS5SZGF0YSIpCmxvYWQoZmlsZT0iSW5wdXREYXRhL0Nsb2NrQ2FsY3VsYXRpb25zSW5wdXQvRGF0YV9QUkVET19QbGFjZW50YV9mZW1hbGUuUmRhdGEiKQpgYGAKCipDb3JkIGJsb29kICYgUGxhY2VudGEgKGluIElUVSkqCmBgYHtyfQpETkFtR0FzX2JpcnRoIDwtIERhdGFfQ29yZF9QbGFjZW50YV9JVFVbICxjKCJETkFtR0FfQm9obGluIiwiRE5BbUdBX0xlZSIsICJHZXN0YXRpb25hbF9BZ2VfV2Vla3MiKV0KY29sbmFtZXMoRE5BbUdBc19iaXJ0aCkgPC0gYygiQ29yZGJsb29kIiwgIlBsYWNlbnRhIiwgIkdBX2JpcnRoIikKYGBgCgpgYGB7cn0KQmlydGhjb3JyRE5BbUdBcyA8LSByY29ycihhcy5tYXRyaXgoRE5BbUdBc19iaXJ0aCkpCkJpcnRoY29yckROQW1HQXMKYGBgCgphZGp1c3RpbmcgZm9yIEdBIGF0IGJpcnRoCmBgYHtyfQojIHBhcnRpYWwgY29ycmVsYXRpb24KcGNvci50ZXN0KHg9RE5BbUdBc19iaXJ0aCRDb3JkYmxvb2QsIHk9RE5BbUdBc19iaXJ0aCRQbGFjZW50YSwgej1ETkFtR0FzX2JpcnRoJEdBX2JpcnRoKQpgYGAKCmBgYHtyfQpjb3JfY29yZF9wbGFjZW50YV9kbmFtZ2EgPC1nZ3NjYXR0ZXIoRGF0YV9Db3JkX1BsYWNlbnRhX0lUVSwgeCA9ICJETkFtR0FfQm9obGluIiwgeSA9ICJETkFtR0FfTGVlIiwgCiAgICAgICAgICBhZGQgPSAicmVnLmxpbmUiLCBjb25mLmludCA9IFRSVUUsIAogICAgICAgICAjIGNvci5jb2VmID0gVFJVRSwgY29yLm1ldGhvZCA9ICJwZWFyc29uIiwKICAgICAgICAgIHhsYWIgPSAiRE5BbSBHQSBjb3JkIGJsb29kICh3ZWVrcykiLCB5bGFiID0gIkROQW1HQSBQbGFjZW50YSAod2Vla3MpIiwgc3VidGl0bGU9IiBJVFUgKG4gPSAzOTApIikrCiAgIHN0YXRfY29yKGxhYmVsLnggPSAzMiwgbGFiZWwueT00NCxwLmFjY3VyYWN5ID0gMC4wMDEsIHIuYWNjdXJhY3kgPSAwLjAxKSsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChzaXplPTkpLCBheGlzLnRleHQueT1lbGVtZW50X3RleHQoc2l6ZT05KSwgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KHNpemU9MTIpLCBheGlzLnRpdGxlLng9ZWxlbWVudF90ZXh0KHNpemU9MTIpLAogIHBhbmVsLmdyaWQubWFqb3IgPSBlbGVtZW50X2JsYW5rKCksCiAgcGFuZWwuZ3JpZC5taW5vciA9IGVsZW1lbnRfYmxhbmsoKSkrCiAgc2NhbGVfeV9jb250aW51b3VzKGxpbWl0cyA9IGMoMzAsNDQpLCBicmVha3MgPSBzZXEoMzAsNDQsIGJ5PTIpKSsKIHNjYWxlX3hfY29udGludW91cyhsaW1pdHMgPSBjKDMyLDQ0KSwgYnJlYWtzID0gc2VxKDMyLDQ0LCBieT0yKSkKYGBgCgpgYGB7cn0KcG5nKGZpbGU9IlJlc3VsdHMvRmlndXJlcy9kaWZmVGlzc3Vlcy9ETkFtR0FfQ29yZF9QbGFjZW50YV9JVFUucG5nIiwgd2lkdGg9IDI2MDAsIGhlaWdodD0xNjAwLCByZXM9NTAwKQpjb3JfY29yZF9wbGFjZW50YV9kbmFtZ2EKZGV2Lm9mZigpCmBgYAoKCipDb3JkIGJsb29kIGFuZCBQbGFjZW50YSAoaW4gUFJFRE8pKgpgYGB7cn0KRE5BbUdBc1BSRURPIDwtIERhdGFfUFJFRE9fRVBJQ19Db3JkX1BsYWNlbnRhWyAsYygiRE5BbUdBX0JvaGxpbiIsIkROQW1HQV9MZWUiLCAiR2VzdGF0aW9uYWxfQWdlIildCmNvbG5hbWVzKEROQW1HQXNQUkVETykgPC0gYygiQ29yZGJsb29kIiwgIlBsYWNlbnRhIiwgIkdBX2JpcnRoIikKYGBgCgpgYGB7cn0KYWxsY29ycnNETkFtR0FzUFJFRE8gPC0gcmNvcnIoYXMubWF0cml4KEROQW1HQXNQUkVETykpCmFsbGNvcnJzRE5BbUdBc1BSRURPCmBgYAoKYGBge3J9CiMgcGFydGlhbCBjb3JyZWxhdGlvbgpwY29yLnRlc3QoeD1ETkFtR0FzUFJFRE8kQ29yZCwgeT1ETkFtR0FzUFJFRE8kUGxhY2VudGEsIHo9RE5BbUdBc1BSRURPWyxjKCJHQV9iaXJ0aCIpXSkKYGBgCgoKYGBge3J9CmNvcl9jb3JkX3BsYWNlbnRhX2RuYW1nYV9wcmVkbyA8LWdnc2NhdHRlcihEYXRhX1BSRURPX0VQSUNfQ29yZF9QbGFjZW50YSwgeCA9ICJETkFtR0FfQm9obGluIiwgeSA9ICJETkFtR0FfTGVlIiwgCiAgICAgICAgICBhZGQgPSAicmVnLmxpbmUiLCBjb25mLmludCA9IFRSVUUsIAogICAgICAgICAjIGNvci5jb2VmID0gVFJVRSwgY29yLm1ldGhvZCA9ICJwZWFyc29uIiwKICAgICAgICAgIHhsYWIgPSAiRE5BbSBHQSBjb3JkIGJsb29kICh3ZWVrcykiLCB5bGFiID0gIkROQW1HQSBQbGFjZW50YSAod2Vla3MpIiwgc3VidGl0bGU9IiBQUkVETyAobiA9IDExNikiKSsKICAgc3RhdF9jb3IobGFiZWwueCA9IDM0LCBsYWJlbC55PTQyLHAuYWNjdXJhY3kgPSAwLjAwMSwgci5hY2N1cmFjeSA9IDAuMDEpKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemU9OSksIGF4aXMudGV4dC55PWVsZW1lbnRfdGV4dChzaXplPTkpLCBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoc2l6ZT0xMiksIGF4aXMudGl0bGUueD1lbGVtZW50X3RleHQoc2l6ZT0xMiksCiAgcGFuZWwuZ3JpZC5tYWpvciA9IGVsZW1lbnRfYmxhbmsoKSwKICBwYW5lbC5ncmlkLm1pbm9yID0gZWxlbWVudF9ibGFuaygpKSArCiAgc2NhbGVfeV9jb250aW51b3VzKGxpbWl0cyA9IGMoMzIsNDIpLCBicmVha3MgPSBzZXEoMzIsNDIsIGJ5PTIpKSsKIHNjYWxlX3hfY29udGludW91cyhsaW1pdHMgPSBjKDM0LDQyKSwgYnJlYWtzID0gc2VxKDM0LDQyLCBieT0yKSkKYGBgCgpgYGB7cn0KcG5nKGZpbGU9IlJlc3VsdHMvRmlndXJlcy9kaWZmVGlzc3Vlcy9ETkFtR0FfQ29yZF9QbGFjZW50YV9QUkVETy5wbmciLCB3aWR0aD0gMjYwMCwgaGVpZ2h0PTE2MDAsIHJlcz01MDApCmNvcl9jb3JkX3BsYWNlbnRhX2RuYW1nYV9wcmVkbwpkZXYub2ZmKCkKYGBgCgoKKkNWUyBhbmQgUGxhY2VudGEqCgpgYGB7cn0KRE5BbUdBc19DUCA8LSBEYXRhX0NWU19QbGFjZW50YV9JVFVbICxjKCJETkFtR0FfTGVlX0NWUyIsIkROQW1HQV9MZWVfUGxhY2VudGEiLCAiZ2VzdGFnZV9hdF9DVlNfd2Vla3MiLCAiR2VzdGF0aW9uYWxfQWdlX1dlZWtzIildCmNvbG5hbWVzKEROQW1HQXNfQ1ApIDwtIGMoIkNWUyIsICJQbGFjZW50YSIsICJHQV9DVlMiLCAiR0FfQmlydGgiKQpgYGAKCmBgYHtyfQpDUGNvcnJETkFtR0FzIDwtIHJjb3JyKGFzLm1hdHJpeChETkFtR0FzX0NQKSkKQ1Bjb3JyRE5BbUdBcwpgYGAKCmBgYHtyfQojIHBhcnRpYWwgY29ycmVsYXRpb24KcGNvci50ZXN0KHg9RE5BbUdBc19DUCRDVlMsIHk9RE5BbUdBc19DUCRQbGFjZW50YSwgej1ETkFtR0FzX0NQWyxjKCJHQV9DVlMiLCJHQV9CaXJ0aCIpXSkKYGBgCgpgYGB7cn0KY29yX2N2c19wbGFjZW50YV9kbmFtZ2EgPC1nZ3NjYXR0ZXIoRGF0YV9DVlNfUGxhY2VudGFfSVRVLCB4ID0gIkROQW1HQV9MZWVfQ1ZTIiwgeSA9ICJETkFtR0FfTGVlX1BsYWNlbnRhIiwgCiAgICAgICAgICBhZGQgPSAicmVnLmxpbmUiLCBjb25mLmludCA9IFRSVUUsIAogICAgICAgICAjIGNvci5jb2VmID0gVFJVRSwgY29yLm1ldGhvZCA9ICJwZWFyc29uIiwKICAgICAgICAgIHhsYWIgPSAiRE5BbSBHQSBDVlMgKHdlZWtzKSIsIHlsYWIgPSAiRE5BbUdBIHBsYWNlbnRhICh3ZWVrcykiLCBzdWJ0aXRsZT0iIElUVSAobiA9IDg2KSIpKwogICBzdGF0X2NvcihsYWJlbC54ID0gNiwgbGFiZWwueT00NCwgcC5hY2N1cmFjeSA9IDAuMDEsIHIuYWNjdXJhY3kgPSAwLjAxKSsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChzaXplPTkpLCBheGlzLnRleHQueT1lbGVtZW50X3RleHQoc2l6ZT05KSwgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KHNpemU9MTIpLCBheGlzLnRpdGxlLng9ZWxlbWVudF90ZXh0KHNpemU9MTIpLAogIHBhbmVsLmdyaWQubWFqb3IgPSBlbGVtZW50X2JsYW5rKCksCiAgcGFuZWwuZ3JpZC5taW5vciA9IGVsZW1lbnRfYmxhbmsoKSkrCiAgc2NhbGVfeV9jb250aW51b3VzKGxpbWl0cyA9IGMoMzQsNDQpLCBicmVha3MgPSBzZXEoMzQsNDQsIGJ5PTIpKSsKIHNjYWxlX3hfY29udGludW91cyhsaW1pdHMgPSBjKDYsMTQpLCBicmVha3MgPSBzZXEoNiwxNCwgYnk9MikpCmBgYAoKYGBge3J9CnBuZyhmaWxlPSJSZXN1bHRzL0ZpZ3VyZXMvZGlmZlRpc3N1ZXMvRE5BbUdBX0NWU19QbGFjZW50YS5wbmciLCB3aWR0aD0gMjYwMCwgaGVpZ2h0PTE2MDAsIHJlcz01MDApCmNvcl9jdnNfcGxhY2VudGFfZG5hbWdhCmRldi5vZmYoKQpgYGAKCgoqQ1ZTIGFuZCBDb3JkIGJsb29kKgpgYGB7cn0KRE5BbUdBc19DQyA8LSBEYXRhX0NWU19Db3JkX0lUVVsgLGMoIkROQW1HQV9MZWUiLCJETkFtR0FfQm9obGluIiwgImdlc3RhZ2VfYXRfQ1ZTX3dlZWtzIiwgIkdlc3RhdGlvbmFsX0FnZV9XZWVrcyIpXQpjb2xuYW1lcyhETkFtR0FzX0NDKSA8LSBjKCJDVlMiLCAiQ29yZCBibG9vZCIsICJHQV9DVlMiLCAiR0FfQmlydGgiKQpgYGAKCmBgYHtyfQpDQ2NvcnJETkFtR0FzIDwtIHJjb3JyKGFzLm1hdHJpeChETkFtR0FzX0NDKSkKQ0Njb3JyRE5BbUdBcwpgYGAKCmBgYHtyfQojIHBhcnRpYWwgY29ycmVsYXRpb24KcGNvci50ZXN0KHg9RE5BbUdBc19DQyRDVlMsIHk9RE5BbUdBc19DQyRDb3JkLCB6PUROQW1HQXNfQ0NbLGMoIkdBX0NWUyIsIkdBX0JpcnRoIildKQpgYGAKCmBgYHtyfQpjb3JfY3ZzX2NvcmRfZG5hbWdhIDwtIGdnc2NhdHRlcihEYXRhX0NWU19Db3JkX0lUVSwgeCA9ICJETkFtR0FfTGVlIiwgeSA9ICJETkFtR0FfQm9obGluIiwgCiAgICAgICAgICBhZGQgPSAicmVnLmxpbmUiLCBjb25mLmludCA9IFRSVUUsIAogICAgICAgICAjIGNvci5jb2VmID0gVFJVRSwgY29yLm1ldGhvZCA9ICJwZWFyc29uIiwKICAgICAgICAgIHhsYWIgPSAiRE5BbSBHQSBDVlMgKHdlZWtzKSIsIHlsYWIgPSAiRE5BbUdBIGNvcmQgYmxvb2QgKHdlZWtzKSIsIHN1YnRpdGxlPSIgSVRVIChuID0gNzMpIikrCiAgIHN0YXRfY29yKGxhYmVsLnggPSA2LCBsYWJlbC55PTQyLHAuYWNjdXJhY3kgPSAwLjAxLCByLmFjY3VyYWN5ID0gMC4wMSkrCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoc2l6ZT05KSwgYXhpcy50ZXh0Lnk9ZWxlbWVudF90ZXh0KHNpemU9OSksIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChzaXplPTEyKSwgYXhpcy50aXRsZS54PWVsZW1lbnRfdGV4dChzaXplPTEyKSwKICBwYW5lbC5ncmlkLm1ham9yID0gZWxlbWVudF9ibGFuaygpLAogIHBhbmVsLmdyaWQubWlub3IgPSBlbGVtZW50X2JsYW5rKCkpKwogIHNjYWxlX3lfY29udGludW91cyhsaW1pdHMgPSBjKDMyLDQyKSwgYnJlYWtzID0gc2VxKDMyLDQyLCBieT0yKSkrCiBzY2FsZV94X2NvbnRpbnVvdXMobGltaXRzID0gYyg2LDE0KSwgYnJlYWtzID0gc2VxKDYsMTQsIGJ5PTIpKQpgYGAKCmBgYHtyfQpwbmcoZmlsZT0iUmVzdWx0cy9GaWd1cmVzL2RpZmZUaXNzdWVzL0ROQW1HQV9DVlNfQ29yZC5wbmciLCB3aWR0aD0gMjYwMCwgaGVpZ2h0PTE2MDAsIHJlcz01MDApCmNvcl9jdnNfY29yZF9kbmFtZ2EKZGV2Lm9mZigpCmBgYAoKClt0byB0aGUgdG9wXSgjdG9wKSAgCgojIyBDb3JyZXNwb25kZW5jZSBFQUFSIHsjY29yVGlzc3Vlc0VBQVJ9ICAKCkZpZy4gNAoqQ29yZCBibG9vZCAmIFBsYWNlbnRhIChpbiBJVFUpKgpgYGB7cn0KRE5BbUdBUmVzaWRzQ0JpcnRoIDwtIERhdGFfQ29yZF9QbGFjZW50YV9JVFVbICxjKCJFQUFSX0JvaGxpbiIsIkVBQVJfTGVlIildCmNvbG5hbWVzKEROQW1HQVJlc2lkc0NCaXJ0aCkgPC0gYygiQ29yZGJsb29kIiwgIlBsYWNlbnRhIikKYGBgCgpgYGB7cn0KYWxsY29ycnNETkFtR0FSZXNpZENCaXJ0aCA8LSByY29ycihhcy5tYXRyaXgoRE5BbUdBUmVzaWRzQ0JpcnRoKSkKYWxsY29ycnNETkFtR0FSZXNpZENCaXJ0aApgYGAKCgpgYGB7cn0KY29yX2NvcmRfcGxhY2VudGFfcmVzaWQgPC0gZ2dzY2F0dGVyKERhdGFfQ29yZF9QbGFjZW50YV9JVFUsIHggPSAiRUFBUl9Cb2hsaW4iLCB5ID0gIkVBQVJfTGVlIiwgCiAgICAgICAgICBhZGQgPSAicmVnLmxpbmUiLCBjb25mLmludCA9IFRSVUUsIAogICAgICAgICAgeGxhYiA9ICJFQUFSIENvcmQgYmxvb2QiLCB5bGFiID0gIkVBQVIgZmV0YWwgUGxhY2VudGEiKSsKICAgICAgICAgIHN0YXRfY29yKG1ldGhvZCA9ICJwZWFyc29uIiwgbGFiZWwueCA9IC0yLCBsYWJlbC55ID0gNCwgci5kaWdpdHMgPSAxLCBwLmRpZ2l0cyA9IDIpKwogICAgICAgICAgZ2VvbV9obGluZSh5aW50ZXJjZXB0PTAsIGxpbmV0eXBlPSJkYXNoZWQiKSsKICAgICAgICAgIGdlb21fdmxpbmUoeGludGVyY2VwdD0wLCBsaW5ldHlwZT0iZGFzaGVkIikrCiAgdGhlbWUodGV4dCA9IGVsZW1lbnRfdGV4dChzaXplPTEzKSwgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoc2l6ZT0xMykpKwogICAgICAgICAgY29vcmRfY2FydGVzaWFuKHhsaW0gPSBjKC0yLCAyKSwgeWxpbT1jKC00LDQpKSAKCmNvcl9jb3JkX3BsYWNlbnRhX3Jlc2lkCgpjb3JfY29yZF9wbGFjZW50YV9yZXNpZF9mIDwtIGdnc2NhdHRlcihEYXRhX0NvcmRfUGxhY2VudGFfSVRVLCB4ID0gIkVBQVJfQm9obGluIiwgeSA9ICJFQUFSX0xlZSIsIAogICAgICAgICAgYWRkID0gInJlZy5saW5lIiwgY29uZi5pbnQgPSBUUlVFLCAKICAgICAgICAgIHhsYWIgPSAiRUFBUiBDb3JkIGJsb29kIiwgeWxhYiA9ICJFQUFSIGZldGFsIFBsYWNlbnRhIikrCiAgICAgICAgICAjc3RhdF9jb3IobWV0aG9kID0gInBlYXJzb24iLCBsYWJlbC54ID0gLTIuNSwgbGFiZWwueSA9IDUsIHIuZGlnaXRzID0gMSwgcC5kaWdpdHMgPSAzKSsKICAgICAgICAgIGdlb21faGxpbmUoeWludGVyY2VwdD0wLCBsaW5ldHlwZT0iZGFzaGVkIikrCiAgICAgICAgICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQ9MCwgbGluZXR5cGU9ImRhc2hlZCIpKwogICAgICAgIHRoZW1lKHRleHQgPSBlbGVtZW50X3RleHQoc2l6ZT0xMyksIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemU9MTMpKSsKICAgICAgICAgIGNvb3JkX2NhcnRlc2lhbih4bGltID0gYygtMiwgMiksIHlsaW09YygtNCw0KSkgCiAgI3NjYWxlX3lfY29udGludW91cyhicmVha3MgPSBjKC00LC0zLC0yLC0xLDAsMSwyLDMsNCkpICsKICAjc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcyA9IGMoLTIsLTEsMCwxLDIpKQoKcmVzaWRfY29yZHBsYWNlbnRhX2l0dSA8LSBuYS5vbWl0KERhdGFfQ29yZF9QbGFjZW50YV9JVFVbICxjKCJTYW1wbGVfTmFtZSIsICJFQUFSX0JvaGxpbiIsICJFQUFSX0xlZSIpXSkKcmVzaWRfY29yZHBsYWNlbnRhX2l0dSRFQUFSX0JvaGxpbl9zIDwtIHNjYWxlKHJlc2lkX2NvcmRwbGFjZW50YV9pdHUkRUFBUl9Cb2hsaW4pCnJlc2lkX2NvcmRwbGFjZW50YV9pdHUkRUFBUl9MZWVfcyA8LSBzY2FsZShyZXNpZF9jb3JkcGxhY2VudGFfaXR1JEVBQVJfTGVlKQpuYW1lcyhyZXNpZF9jb3JkcGxhY2VudGFfaXR1KSA8LSBjKCJTYW1wbGVfTmFtZSIsICJDb3JkIGJsb29kIiwgIlBsYWNlbnRhIiwgIkVBQVIgQ29yZCBibG9vZCAoc2NhbGVkKSIsICJFQUFSIFBsYWNlbnRhIChzY2FsZWQpIikKcmVzaWRfY29yZHBsYWNlbnRhX2l0dV9scyA9IHJlc2hhcGUyOjptZWx0KHJlc2lkX2NvcmRwbGFjZW50YV9pdHVbICxjKDE6MyldKQpjb2xfcmVzaWRfY29yZHBsYWNlbnRhX2l0dV9scyA8LSBmYWN0b3IocmVzaWRfY29yZHBsYWNlbnRhX2l0dV9scyRTYW1wbGVfTmFtZSkKCmNvbG9yX3Bsb3QgPSBnckRldmljZXM6OmNvbG9ycygpW2dyZXAoJ2dyKGF8ZSl5JywgZ3JEZXZpY2VzOjpjb2xvcnMoKSwgaW52ZXJ0ID0gVCldCmNvbG9yX3Bsb3QgPC0gY29sb3JfcGxvdFsxOjM2M10KCmJveF9jb3JkX3BsYWNlbnRhX3Jlc2lkIDwtIGdncGxvdChkYXRhPXJlc2lkX2NvcmRwbGFjZW50YV9pdHVfbHMsIGFlcyh4PXZhcmlhYmxlLCB5PXZhbHVlKSkrCiAgZ2VvbV9ib3hwbG90KCkrCiAgI2dlb21fcG9pbnQoYWVzKGNvbG91ciA9IGNvbF9yZXNpZF9jb3JkcGxhY2VudGFfaXR1X2xzKSkrCiAgZ2VvbV9qaXR0ZXIoYWVzKGNvbG91ciA9IGNvbF9yZXNpZF9jb3JkcGxhY2VudGFfaXR1X2xzKSwgc2l6ZT0wLjQsIGFscGhhPTAuOSkrCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcz1jb2xvcl9wbG90KSsKICB5bGFiKCJlcGlnZW5ldGljIGFnZSBhY2NlbGVyYXRpb24gcmVzaWR1YWxzIikrIAogIHhsYWIoIiIpKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikgCgpib3hfY29yZF9wbGFjZW50YV9yZXNpZAoKcG5nKGZpbGVuYW1lPSJSZXN1bHRzL0ZpZ3VyZXMvZGlmZlRpc3N1ZXMvY29yRUFBUl9jb3JkX3BsYWNlbnRhX0lUVS5wbmciLCB3aWR0aD0yNjAwLCBoZWlnaHQ9MTYwMCwgcmVzPTUwMCkKY29yX2NvcmRfcGxhY2VudGFfcmVzaWQKZGV2Lm9mZigpCgpwbmcoZmlsZW5hbWU9IlJlc3VsdHMvRmlndXJlcy9kaWZmVGlzc3Vlcy9jb3JFQUFSX2NvcmRfcGxhY2VudGFfSVRVX0YucG5nIiwgd2lkdGg9MjYwMCwgaGVpZ2h0PTE2MDAsIHJlcz01MDApCmNvcl9jb3JkX3BsYWNlbnRhX3Jlc2lkX2YKZGV2Lm9mZigpCgpwbmcoZmlsZW5hbWU9IlJlc3VsdHMvRmlndXJlcy9kaWZmVGlzc3Vlcy9ib3hFQUFSX2NvcmRfcGxhY2VudGFfSVRVLnBuZyIsIHdpZHRoPTI4MDAsIGhlaWdodD0xNDAwLCByZXM9NDAwKQpib3hfY29yZF9wbGFjZW50YV9yZXNpZCAKZGV2Lm9mZigpCgojbGV2ZW5lcyB0ZXN0IApsZXZlbmVUZXN0KHZhbHVlIH4gdmFyaWFibGUsIHJlc2lkX2NvcmRwbGFjZW50YV9pdHVfbHMsIGNlbnRlcj1tZWFuKQojIHNpZ25pZmljYW50CiNMZXZlbmUncyBUZXN0IGZvciBIb21vZ2VuZWl0eSBvZiBWYXJpYW5jZSAoY2VudGVyID0gbWVhbikKIyAgICAgICBEZiBGIHZhbHVlICAgIFByKD5GKSAgICAKI2dyb3VwICAgMSAgMTM1Ljc2IDwgMi4yZS0xNiAqKioKIyAgICAgIDcyNApgYGAKCmBgYHtyfQojIHBhaXJlZCB0LXRlc3QKZCA8LSB3aXRoKHJlc2lkX2NvcmRwbGFjZW50YV9pdHVfbHMsIAogICAgICAgIHZhbHVlW3ZhcmlhYmxlID09ICJDb3JkIGJsb29kIl0gLSB2YWx1ZVt2YXJpYWJsZSA9PSAiUGxhY2VudGEiXSkKIyBTaGFwaXJvLVdpbGsgbm9ybWFsaXR5IHRlc3QgZm9yIHRoZSBkaWZmZXJlbmNlcwpzaGFwaXJvLnRlc3QoZCkKIyBkaXN0cmlidXRpb24gb2YgdGhlIGRpZmZlcmVuY2VzIChkKSBhcmUgbm90IHNpZ25pZmljYW50bHkgZGlmZmVyZW50IGZyb20gbm9ybWFsIGRpc3RyaWJ1dGlvbi4gSW4gb3RoZXIgd29yZHMsIHdlIGNhbiBhc3N1bWUgdGhlIG5vcm1hbGl0eQoKdF9wYWlyZWRfaXR1X3Jlc2lkIDwtIHQudGVzdCh2YWx1ZSB+IHZhcmlhYmxlLCBkYXRhID0gcmVzaWRfY29yZHBsYWNlbnRhX2l0dV9scywgcGFpcmVkID0gVFJVRSkKdF9wYWlyZWRfaXR1X3Jlc2lkCnRpZHlfdF9wYWlyZWRfaXR1X3Jlc2lkIDwtIGJyb29tOjp0aWR5KHRfcGFpcmVkX2l0dV9yZXNpZCkKCmRkcGx5KHJlc2lkX2NvcmRwbGFjZW50YV9pdHVfbHMsIC4odmFyaWFibGUpLCBjb2x3aXNlKG1lYW4pKQpkZHBseShyZXNpZF9jb3JkcGxhY2VudGFfaXR1X2xzLCAuKHZhcmlhYmxlKSwgY29sd2lzZShzZCkpCgoKd3JpdGUuY3N2KHRpZHlfdF9wYWlyZWRfaXR1X3Jlc2lkLCAiUmVzdWx0cy9UYWJsZXMvdF9wYWlyZWRfZWFhcl9pdHVfY29yZHBsYWNlbnRhLmNzdiIpCmBgYAoKKkNvcmQgYmxvb2QgYW5kIFBsYWNlbnRhIChpbiBQUkVETykqCmBgYHtyfQpETkFtR0FSZXNpZENQUkVETyA8LSBEYXRhX1BSRURPX0VQSUNfQ29yZF9QbGFjZW50YVsgLGMoIkVBQVJfQm9obGluIiwiRUFBUl9MZWUiKV0KY29sbmFtZXMoRE5BbUdBUmVzaWRDUFJFRE8pIDwtIGMoIkNvcmRibG9vZCIsICJQbGFjZW50YSIpCmBgYAoKYGBge3J9CmFsbGNvcnJzRE5BbUdBUmVzaWRDUFJFRE8gPC0gcmNvcnIoYXMubWF0cml4KEROQW1HQVJlc2lkQ1BSRURPKSkKYWxsY29ycnNETkFtR0FSZXNpZENQUkVETwpgYGAKCgpgYGB7cn0KY29yX2NvcmRfcGxhY2VudGFfcmVzaWRfcHJlZG8gPC0gZ2dzY2F0dGVyKERhdGFfUFJFRE9fRVBJQ19Db3JkX1BsYWNlbnRhLCB4ID0gIkVBQVJfQm9obGluIiwgeSA9ICJFQUFSX0xlZSIsIAogICAgICAgICAgYWRkID0gInJlZy5saW5lIiwgY29uZi5pbnQgPSBUUlVFLCAKICAgICAgICAgIHhsYWIgPSAiRUFBUiBDb3JkIGJsb29kIiwgeWxhYiA9ICJFQUFSIGRlY2lkdWFsIFBsYWNlbnRhIikrCiAgICAgICAgICBzdGF0X2NvcihtZXRob2QgPSAicGVhcnNvbiIsIGxhYmVsLnggPSAtMiwgbGFiZWwueSA9IDQsIHIuZGlnaXRzID0gMSwgcC5kaWdpdHMgPSAyKSsKICAgICAgICAgIGdlb21faGxpbmUoeWludGVyY2VwdD0wLCBsaW5ldHlwZT0iZGFzaGVkIikrCiAgICAgICAgICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQ9MCwgbGluZXR5cGU9ImRhc2hlZCIpKwogICAgICAgIHRoZW1lKHRleHQgPSBlbGVtZW50X3RleHQoc2l6ZT0xMyksIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemU9MTMpKSsKICAgICAgICAgIGNvb3JkX2NhcnRlc2lhbih4bGltID0gYygtMiwgMiksIHlsaW09YygtNCw0KSkKCmNvcl9jb3JkX3BsYWNlbnRhX3Jlc2lkX3ByZWRvCgpjb3JfY29yZF9wbGFjZW50YV9yZXNpZF9wcmVkb19mIDwtIGdnc2NhdHRlcihEYXRhX1BSRURPX0VQSUNfQ29yZF9QbGFjZW50YSwgeCA9ICJFQUFSX0JvaGxpbiIsIHkgPSAiRUFBUl9MZWUiLCAKICAgICAgICAgIGFkZCA9ICJyZWcubGluZSIsIGNvbmYuaW50ID0gVFJVRSwgCiAgICAgICAgICB4bGFiID0gIkVBQVIgQ29yZCBibG9vZCIsIHlsYWIgPSAiRUFBUiBkZWNpZHVhbCBQbGFjZW50YSIpKwogICAgICAgICAgZ2VvbV9obGluZSh5aW50ZXJjZXB0PTAsIGxpbmV0eXBlPSJkYXNoZWQiKSsKICAgICAgICAgIGdlb21fdmxpbmUoeGludGVyY2VwdD0wLCBsaW5ldHlwZT0iZGFzaGVkIikrCiAgICAgICAgdGhlbWUodGV4dCA9IGVsZW1lbnRfdGV4dChzaXplPTEzKSwgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoc2l6ZT0xMykpKwogICAgICAgICAgY29vcmRfY2FydGVzaWFuKHhsaW0gPSBjKC0yLCAyKSwgeWxpbT1jKC00LDQpKQoKY29yX2NvcmRfcGxhY2VudGFfcmVzaWRfcHJlZG9fZgoKcmVzaWRfY29yZHBsYWNlbnRhX3ByZWRvIDwtIG5hLm9taXQoRGF0YV9QUkVET19FUElDX0NvcmRfUGxhY2VudGFbICxjKCJTYW1wbGVfTmFtZSIsICJFQUFSX0JvaGxpbiIsICJFQUFSX0xlZSIpXSkKcmVzaWRfY29yZHBsYWNlbnRhX3ByZWRvJEVBQVJfQm9obGluX3MgPC0gc2NhbGUocmVzaWRfY29yZHBsYWNlbnRhX3ByZWRvJEVBQVJfQm9obGluKQpyZXNpZF9jb3JkcGxhY2VudGFfcHJlZG8kRUFBUl9MZWVfcyA8LSBzY2FsZShyZXNpZF9jb3JkcGxhY2VudGFfcHJlZG8kRUFBUl9MZWUpCm5hbWVzKHJlc2lkX2NvcmRwbGFjZW50YV9wcmVkbykgPC0gYygiU2FtcGxlX05hbWUiLCAiQ29yZCBibG9vZCIsICJQbGFjZW50YSIsICJFQUFSIENvcmQgYmxvb2QgKHNjYWxlZCkiLCAiRUFBUiBQbGFjZW50YSAoc2NhbGVkKSIpCnJlc2lkX2NvcmRwbGFjZW50YV9wcmVkb19scyA9IHJlc2hhcGUyOjptZWx0KHJlc2lkX2NvcmRwbGFjZW50YV9wcmVkb1sgLGMoMTozKV0pCmNvbF9yZXNpZF9jb3JkcGxhY2VudGFfcHJlZG9fbHMgPC0gZmFjdG9yKHJlc2lkX2NvcmRwbGFjZW50YV9wcmVkb19scyRTYW1wbGVfTmFtZSkKCmNvbG9yX3Bsb3QgPSBnckRldmljZXM6OmNvbG9ycygpW2dyZXAoJ2dyKGF8ZSl5JywgZ3JEZXZpY2VzOjpjb2xvcnMoKSwgaW52ZXJ0ID0gVCldCmNvbG9yX3Bsb3QgPC0gY29sb3JfcGxvdFsxOjExNl0KCmJveF9jb3JkX3BsYWNlbnRhX3Jlc2lkX3ByZWRvIDwtIGdncGxvdChkYXRhPXJlc2lkX2NvcmRwbGFjZW50YV9wcmVkb19scywgYWVzKHg9dmFyaWFibGUsIHk9dmFsdWUpKSsKICBnZW9tX2JveHBsb3QoKSsKICAjZ2VvbV9wb2ludChhZXMoY29sb3VyID0gY29sX3Jlc2lkX2NvcmRwbGFjZW50YV9pdHVfbHMpKSsKICBnZW9tX2ppdHRlcihhZXMoY29sb3VyID0gY29sX3Jlc2lkX2NvcmRwbGFjZW50YV9wcmVkb19scyksIHNpemU9MC40LCBhbHBoYT0wLjkpKwogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXM9Y29sb3JfcGxvdCkrCiAgeWxhYigiZXBpZ2VuZXRpYyBhZ2UgYWNjZWxlcmF0aW9uIHJlc2lkdWFscyIpKyAKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpIAoKYm94X2NvcmRfcGxhY2VudGFfcmVzaWRfcHJlZG8KCnBuZyhmaWxlbmFtZT0iUmVzdWx0cy9GaWd1cmVzL2RpZmZUaXNzdWVzL2NvckVBQVJfY29yZF9wbGFjZW50YV9QUkVETy5wbmciLCB3aWR0aD0yNjAwLCBoZWlnaHQ9MTYwMCwgcmVzPTUwMCkKY29yX2NvcmRfcGxhY2VudGFfcmVzaWRfcHJlZG8KZGV2Lm9mZigpCgpwbmcoZmlsZW5hbWU9IlJlc3VsdHMvRmlndXJlcy9kaWZmVGlzc3Vlcy9jb3JFQUFSX2NvcmRfcGxhY2VudGFfUFJFRE9fRi5wbmciLCB3aWR0aD0yNjAwLCBoZWlnaHQ9MTYwMCwgcmVzPTUwMCkKY29yX2NvcmRfcGxhY2VudGFfcmVzaWRfcHJlZG9fZgpkZXYub2ZmKCkKCnBuZyhmaWxlbmFtZT0iUmVzdWx0cy9GaWd1cmVzL2RpZmZUaXNzdWVzL2JveEVBQVJfY29yZF9wbGFjZW50YV9QUkVETy5wbmciLCB3aWR0aD0yODAwLCBoZWlnaHQ9MTQwMCwgcmVzPTQwMCkKYm94X2NvcmRfcGxhY2VudGFfcmVzaWRfcHJlZG8KZGV2Lm9mZigpCgojbGV2ZW5lcyB0ZXN0IApsZXZlbmVUZXN0KHZhbHVlIH4gdmFyaWFibGUsIHJlc2lkX2NvcmRwbGFjZW50YV9wcmVkb19scywgY2VudGVyPW1lYW4pCiMgc2lnbmlmaWNhbnQKYGBgCgpgYGB7cn0KIyBwYWlyZWQgdC10ZXN0CmQgPC0gd2l0aChyZXNpZF9jb3JkcGxhY2VudGFfcHJlZG9fbHMsIAogICAgICAgIHZhbHVlW3ZhcmlhYmxlID09ICJDb3JkIGJsb29kIl0gLSB2YWx1ZVt2YXJpYWJsZSA9PSAiUGxhY2VudGEiXSkKIyBTaGFwaXJvLVdpbGsgbm9ybWFsaXR5IHRlc3QgZm9yIHRoZSBkaWZmZXJlbmNlcwpzaGFwaXJvLnRlc3QoZCkKIyBkaXN0cmlidXRpb24gb2YgdGhlIGRpZmZlcmVuY2VzIChkKSBhcmUgbm90IHNpZ25pZmljYW50bHkgZGlmZmVyZW50IGZyb20gbm9ybWFsIGRpc3RyaWJ1dGlvbi4gSW4gb3RoZXIgd29yZHMsIHdlIGNhbiBhc3N1bWUgdGhlIG5vcm1hbGl0eQoKdF9wYWlyZWRfcHJlZG9fcmVzaWQgPC0gdC50ZXN0KHZhbHVlIH4gdmFyaWFibGUsIGRhdGEgPSByZXNpZF9jb3JkcGxhY2VudGFfcHJlZG9fbHMsIHBhaXJlZCA9IFRSVUUpCnRpZHlfdF9wYWlyZWRfcHJlZG9fcmVzaWQgPC0gYnJvb206OnRpZHkodF9wYWlyZWRfcHJlZG9fcmVzaWQpCgp3cml0ZS5jc3YodGlkeV90X3BhaXJlZF9wcmVkb19yZXNpZCwgIlJlc3VsdHMvVGFibGVzL3RfcGFpcmVkX2VhYXJfcHJlZG9fY29yZHBsYWNlbnRhLmNzdiIpCgp0X3BhaXJlZF9wcmVkb19yZXNpZApkZHBseShyZXNpZF9jb3JkcGxhY2VudGFfcHJlZG9fbHMsIC4odmFyaWFibGUpLCBjb2x3aXNlKG1lYW4pKQpkZHBseShyZXNpZF9jb3JkcGxhY2VudGFfcHJlZG9fbHMsIC4odmFyaWFibGUpLCBjb2x3aXNlKHNkKSkKYGBgCgoKKkNWUyBhbmQgUGxhY2VudGEqCmBgYHtyfQpETkFtR0FSZXNpZENDUCA8LSBEYXRhX0NWU19QbGFjZW50YV9JVFVbICxjKCJFQUFSX0xlZV9DVlMiLCAiRUFBUl9MZWVfUGxhY2VudGEiKV0KY29sbmFtZXMoRE5BbUdBUmVzaWRDQ1ApIDwtIGMoIkNWUyIsICJQbGFjZW50YSIpCmBgYAoKYGBge3J9CmFsbGNvcnJzRE5BbUdBUmVzaWRDQ1AgPC0gcmNvcnIoYXMubWF0cml4KEROQW1HQVJlc2lkQ0NQKSkKYWxsY29ycnNETkFtR0FSZXNpZENDUApgYGAKCgpgYGB7cn0KY29yX2N2c19wbGFjZW50YV9yZXNpZCA8LSBnZ3NjYXR0ZXIoRGF0YV9DVlNfUGxhY2VudGFfSVRVLCB4ID0gIkVBQVJfTGVlX0NWUyIsIHkgPSAiRUFBUl9MZWVfUGxhY2VudGEiLCAKICAgICAgICAgIGFkZCA9ICJyZWcubGluZSIsIGNvbmYuaW50ID0gVFJVRSwgeGxhYiA9ICJFQUFSIENWUyIsIHlsYWIgPSAiRUFBUiBmZXRhbCBQbGFjZW50YSIpKwogICAgICAgICB0aGVtZSh0ZXh0ID0gZWxlbWVudF90ZXh0KHNpemU9MTMpLCBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChzaXplPTEzKSkrCiAgICAgICAgIGNvb3JkX2NhcnRlc2lhbih4bGltID0gYygtMiwgMiksIHlsaW09YygtNCw0KSkrCiAgICAgICAgICBzdGF0X2NvcihtZXRob2QgPSAicGVhcnNvbiIsIGxhYmVsLnggPSAtMiwgbGFiZWwueSA9IDQsIHIuZGlnaXRzID0gMiwgcC5kaWdpdHMgPSAyKSsKICAgICAgICAgIGdlb21faGxpbmUoeWludGVyY2VwdD0wLCBsaW5ldHlwZT0iZGFzaGVkIikrCiAgICAgICAgICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQ9MCwgbGluZXR5cGU9ImRhc2hlZCIpCgpjb3JfY3ZzX3BsYWNlbnRhX3Jlc2lkCgpjb3JfY3ZzX3BsYWNlbnRhX3Jlc2lkX2YgPC0gZ2dzY2F0dGVyKERhdGFfQ1ZTX1BsYWNlbnRhX0lUVSwgeCA9ICJFQUFSX0xlZV9DVlMiLCB5ID0gIkVBQVJfTGVlX1BsYWNlbnRhIiwgCiAgICAgICAgICBhZGQgPSAicmVnLmxpbmUiLCBjb25mLmludCA9IFRSVUUsIHhsYWIgPSAiRUFBUiBDVlMiLCB5bGFiID0gIkVBQVIgZmV0YWwgUGxhY2VudGEiKSsKICAgICAgICAgIGdlb21faGxpbmUoeWludGVyY2VwdD0wLCBsaW5ldHlwZT0iZGFzaGVkIikrCiAgICAgICAgICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQ9MCwgbGluZXR5cGU9ImRhc2hlZCIpKwogICAgICAgIHRoZW1lKHRleHQgPSBlbGVtZW50X3RleHQoc2l6ZT0xMyksIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemU9MTMpKSsKICAgICAgICAgY29vcmRfY2FydGVzaWFuKHhsaW0gPSBjKC0yLCAyKSwgeWxpbT1jKC00LDQpKQoKY29yX2N2c19wbGFjZW50YV9yZXNpZF9mCgpyZXNpZF9jdnNwbGFjZW50YV9pdHUgPC0gbmEub21pdChEYXRhX0NWU19QbGFjZW50YV9JVFVbICxjKCJTYW1wbGVfTmFtZSIsICJFQUFSX0xlZV9DVlMiLCAiRUFBUl9MZWVfUGxhY2VudGEiKV0pCnJlc2lkX2N2c3BsYWNlbnRhX2l0dSRFQUFSX0JvaGxpbl9zIDwtIHNjYWxlKHJlc2lkX2N2c3BsYWNlbnRhX2l0dSRFQUFSX0xlZV9DVlMpCnJlc2lkX2N2c3BsYWNlbnRhX2l0dSRFQUFSX0xlZV9zIDwtIHNjYWxlKHJlc2lkX2N2c3BsYWNlbnRhX2l0dSRFQUFSX0xlZV9QbGFjZW50YSkKbmFtZXMocmVzaWRfY3ZzcGxhY2VudGFfaXR1KSA8LSBjKCJTYW1wbGVfTmFtZSIsICJDVlMiLCAiUGxhY2VudGEiLCAiRUFBUiBDVlMgKHNjYWxlZCkiLCAiRUFBUiBQbGFjZW50YSAoc2NhbGVkKSIpCnJlc2lkX2N2c3BsYWNlbnRhX2l0dV9scyA9IHJlc2hhcGUyOjptZWx0KHJlc2lkX2N2c3BsYWNlbnRhX2l0dVsgLGMoMTozKV0pCmNvbF9yZXNpZF9jdnNwbGFjZW50YV9pdHVfbHMgPC0gZmFjdG9yKHJlc2lkX2N2c3BsYWNlbnRhX2l0dV9scyRTYW1wbGVfTmFtZSkKCmNvbG9yX3Bsb3QgPSBnckRldmljZXM6OmNvbG9ycygpW2dyZXAoJ2dyKGF8ZSl5JywgZ3JEZXZpY2VzOjpjb2xvcnMoKSwgaW52ZXJ0ID0gVCldCmNvbG9yX3Bsb3QgPC0gY29sb3JfcGxvdFsxOjc4XQoKYm94X2N2c19wbGFjZW50YV9yZXNpZCA8LSBnZ3Bsb3QoZGF0YT1yZXNpZF9jdnNwbGFjZW50YV9pdHVfbHMsIGFlcyh4PXZhcmlhYmxlLCB5PXZhbHVlKSkrCiAgZ2VvbV9ib3hwbG90KCkgKwogICNnZW9tX3BvaW50KGFlcyhjb2xvdXIgPSBjb2xfcmVzaWRfY29yZHBsYWNlbnRhX2l0dV9scykpKwogIGdlb21faml0dGVyKGFlcyhjb2xvdXIgPSBjb2xfcmVzaWRfY3ZzcGxhY2VudGFfaXR1X2xzKSwgc2l6ZT0wLjQsIGFscGhhPTAuOSkrCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcz1jb2xvcl9wbG90KSsKICB5bGFiKCJlcGlnZW5ldGljIGFnZSBhY2NlbGVyYXRpb24gcmVzaWR1YWxzIikrIAogIHhsYWIoIiIpKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikgCgpib3hfY3ZzX3BsYWNlbnRhX3Jlc2lkCgpwbmcoZmlsZW5hbWU9IlJlc3VsdHMvRmlndXJlcy9kaWZmVGlzc3Vlcy9jb3JFQUFSX2N2c19wbGFjZW50YV9JVFUucG5nIiwgd2lkdGg9MjYwMCwgaGVpZ2h0PTE2MDAsIHJlcz01MDApCmNvcl9jdnNfcGxhY2VudGFfcmVzaWQKZGV2Lm9mZigpCgpwbmcoZmlsZW5hbWU9IlJlc3VsdHMvRmlndXJlcy9kaWZmVGlzc3Vlcy9jb3JFQUFSX2N2c19wbGFjZW50YV9JVFVfRi5wbmciLCB3aWR0aD0yNjAwLCBoZWlnaHQ9IDE2MDAsIHJlcz01MDApCmNvcl9jdnNfcGxhY2VudGFfcmVzaWRfZgpkZXYub2ZmKCkKCnBuZyhmaWxlbmFtZT0iUmVzdWx0cy9GaWd1cmVzL2RpZmZUaXNzdWVzL2JveEVBQVJfY3ZzX3BsYWNlbnRhX0lUVS5wbmciLCB3aWR0aD0yODAwLCBoZWlnaHQ9MTQwMCwgcmVzPTQwMCkKYm94X2N2c19wbGFjZW50YV9yZXNpZCAKZGV2Lm9mZigpCgojIHRlc3QgaWYgdmFyaWFuY2UgaW4gRUFBUiBkaWZmZXJlcyBiZXR3ZWVuIGN2cyAmIHBsYWNlbnRhIHVzaW5nIGxldmVuZXMgdGVzdApsZXZlbmVUZXN0KHZhbHVlIH4gdmFyaWFibGUsIHJlc2lkX2N2c3BsYWNlbnRhX2l0dV9scywgY2VudGVyPW1lYW4pCiMgbm90IHNpZ25pZmljYW50CmBgYAoKYGBge3J9CiMgcGFpcmVkIHQtdGVzdApkIDwtIHdpdGgocmVzaWRfY3ZzcGxhY2VudGFfaXR1X2xzLCAKICAgICAgICB2YWx1ZVt2YXJpYWJsZSA9PSAiQ1ZTIl0gLSB2YWx1ZVt2YXJpYWJsZSA9PSAiUGxhY2VudGEiXSkKIyBTaGFwaXJvLVdpbGsgbm9ybWFsaXR5IHRlc3QgZm9yIHRoZSBkaWZmZXJlbmNlcwpzaGFwaXJvLnRlc3QoZCkKIyBkaXN0cmlidXRpb24gb2YgdGhlIGRpZmZlcmVuY2VzIChkKSBhcmUgc2lnbmlmaWNhbnRseSBkaWZmZXJlbnQgZnJvbSBub3JtYWwKCnRfcGFpcmVkX2l0dV9jdnNwbGFjZW50YV9yZXNpZCA8LSB0LnRlc3QodmFsdWUgfiB2YXJpYWJsZSwgZGF0YSA9IHJlc2lkX2N2c3BsYWNlbnRhX2l0dV9scywgcGFpcmVkID0gVFJVRSkKdGlkeV90X3BhaXJlZF9pdHVfY3ZzcGxhY2VudGFfcmVzaWQgPC0gYnJvb206OnRpZHkodF9wYWlyZWRfaXR1X2N2c3BsYWNlbnRhX3Jlc2lkKQoKdF9wYWlyZWRfaXR1X2N2c3BsYWNlbnRhX3Jlc2lkCgp3cml0ZS5jc3YodGlkeV90X3BhaXJlZF9pdHVfY3ZzcGxhY2VudGFfcmVzaWQsICJSZXN1bHRzL1RhYmxlcy90X3BhaXJlZF9pdHVfZWFhcl9jdnNwbGFjZW50YS5jc3YiKQoKZGRwbHkocmVzaWRfY3ZzcGxhY2VudGFfaXR1X2xzLCAuKHZhcmlhYmxlKSwgY29sd2lzZShtZWFuKSkKZGRwbHkocmVzaWRfY3ZzcGxhY2VudGFfaXR1X2xzLCAuKHZhcmlhYmxlKSwgY29sd2lzZShzZCkpCmBgYAoKKkNWUyBhbmQgQ29yZCBibG9vZCoKYGBge3J9CkROQW1HQVJlc2lkQ0MgPC0gRGF0YV9DVlNfQ29yZF9JVFVbICxjKCJFQUFSX0xlZSIsICJFQUFSX0JvaGxpbiIpXQpjb2xuYW1lcyhETkFtR0FSZXNpZENDKSA8LSBjKCJDVlMiLCAiQ29yZCIpCmBgYAoKYGBge3J9CmFsbGNvcnJzRE5BbUdBUmVzaWRDQyA8LSByY29ycihhcy5tYXRyaXgoRE5BbUdBUmVzaWRDQykpCmFsbGNvcnJzRE5BbUdBUmVzaWRDQwpgYGAKCmBgYHtyfQpjb3JfY3ZzX2NvcmRfcmVzaWQgPC0gZ2dzY2F0dGVyKERhdGFfQ1ZTX0NvcmRfSVRVLCB4ID0gIkVBQVJfTGVlIiwgeSA9ICJFQUFSX0JvaGxpbiIsIAogICAgICAgICAgYWRkID0gInJlZy5saW5lIiwgY29uZi5pbnQgPSBUUlVFLCB4bGFiID0gIkVBQVIgQ1ZTIiwgeWxhYiA9ICJFQUFSIENvcmQgYmxvb2QiKSsKICAgICAgICAgIHN0YXRfY29yKG1ldGhvZCA9ICJwZWFyc29uIiwgbGFiZWwueCA9IC0yLCBsYWJlbC55ID0gMiwgci5kaWdpdHMgPSAyLCBwLmRpZ2l0cyA9IDIpKwogICAgICAgICAgZ2VvbV9obGluZSh5aW50ZXJjZXB0PTAsIGxpbmV0eXBlPSJkYXNoZWQiKSsKICAgICAgICAgIGdlb21fdmxpbmUoeGludGVyY2VwdD0wLCBsaW5ldHlwZT0iZGFzaGVkIikrCiAgdGhlbWUodGV4dCA9IGVsZW1lbnRfdGV4dChzaXplPTEzKSwgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoc2l6ZT0xMykpKwogICAgICAgICAgY29vcmRfY2FydGVzaWFuKHhsaW0gPSBjKC0yLCAyKSwgeWxpbT1jKC0yLDIpKQoKY29yX2N2c19jb3JkX3Jlc2lkCgpjb3JfY3ZzX2NvcmRfcmVzaWRfZiA8LSBnZ3NjYXR0ZXIoRGF0YV9DVlNfQ29yZF9JVFUsIHggPSAiRUFBUl9MZWUiLCB5ID0gIkVBQVJfQm9obGluIiwgCiAgICAgICAgICBhZGQgPSAicmVnLmxpbmUiLCBjb25mLmludCA9IFRSVUUsIHhsYWIgPSAiRUFBUiBDVlMiLCB5bGFiID0gIkVBQVIgQ29yZCBibG9vZCIpKwogICAgICAgICAgZ2VvbV9obGluZSh5aW50ZXJjZXB0PTAsIGxpbmV0eXBlPSJkYXNoZWQiKSsKICAgICAgICAgIGdlb21fdmxpbmUoeGludGVyY2VwdD0wLCBsaW5ldHlwZT0iZGFzaGVkIikrCiAgdGhlbWUodGV4dCA9IGVsZW1lbnRfdGV4dChzaXplPTEzKSwgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoc2l6ZT0xMykpKwogICAgICAgICAgY29vcmRfY2FydGVzaWFuKHhsaW0gPSBjKC0yLCAyKSwgeWxpbT1jKC0yLDIpKQoKY29yX2N2c19jb3JkX3Jlc2lkX2YKCnJlc2lkX2N2c2NvcmRfaXR1IDwtIG5hLm9taXQoRGF0YV9DVlNfQ29yZF9JVFVbICxjKCJTYW1wbGVfTmFtZSIsICJFQUFSX0JvaGxpbiIsICJFQUFSX0xlZSIpXSkKcmVzaWRfY3ZzY29yZF9pdHUkRUFBUl9Cb2hsaW5fcyA8LSBzY2FsZShyZXNpZF9jdnNjb3JkX2l0dSRFQUFSX0JvaGxpbikKcmVzaWRfY3ZzY29yZF9pdHUkRUFBUl9MZWVfcyA8LSBzY2FsZShyZXNpZF9jdnNjb3JkX2l0dSRFQUFSX0xlZSkKbmFtZXMocmVzaWRfY3ZzY29yZF9pdHUpIDwtIGMoIlNhbXBsZV9OYW1lIiwgIkNvcmQgYmxvb2QiLCAiQ1ZTIiwgIkVBQVIgQ29yZCBibG9vZCAoc2NhbGVkKSIsICJFQUFSIENWUyAoc2NhbGVkKSIpCnJlc2lkX2N2c2NvcmRfaXR1X2xzID0gcmVzaGFwZTI6Om1lbHQocmVzaWRfY3ZzY29yZF9pdHVbICxjKDE6MyldKQpjb2xfcmVzaWRfY3ZzY29yZF9pdHVfbHMgPC0gZmFjdG9yKHJlc2lkX2N2c2NvcmRfaXR1X2xzJFNhbXBsZV9OYW1lKQoKY29sb3JfcGxvdCA9IGdyRGV2aWNlczo6Y29sb3JzKClbZ3JlcCgnZ3IoYXxlKXknLCBnckRldmljZXM6OmNvbG9ycygpLCBpbnZlcnQgPSBUKV0KY29sb3JfcGxvdCA8LSBjb2xvcl9wbG90WzE6MzYzXQoKYm94X2N2c19jb3JkX3Jlc2lkIDwtIGdncGxvdChkYXRhPXJlc2lkX2N2c2NvcmRfaXR1X2xzLCBhZXMoeD12YXJpYWJsZSwgeT12YWx1ZSkpKwogIGdlb21fYm94cGxvdCgpKwogICNnZW9tX3BvaW50KGFlcyhjb2xvdXIgPSBjb2xfcmVzaWRfY29yZHBsYWNlbnRhX2l0dV9scykpKwogIGdlb21faml0dGVyKGFlcyhjb2xvdXIgPSBjb2xfcmVzaWRfY3ZzY29yZF9pdHVfbHMpLCBzaXplPTAuNCwgYWxwaGE9MC45KSsKICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzPWNvbG9yX3Bsb3QpKwogIHlsYWIoImVwaWdlbmV0aWMgYWdlIGFjY2VsZXJhdGlvbiByZXNpZHVhbHMiKSsgCiAgeGxhYigiIikrCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSAKCmJveF9jdnNfY29yZF9yZXNpZAoKcG5nKGZpbGVuYW1lPSJSZXN1bHRzL0ZpZ3VyZXMvZGlmZlRpc3N1ZXMvY29yRUFBUl9jdnNfY29yZF9JVFUucG5nIiwgd2lkdGg9MjYwMCwgaGVpZ2h0PTE2MDAsIHJlcz01MDApCmNvcl9jdnNfY29yZF9yZXNpZApkZXYub2ZmKCkKCnBuZyhmaWxlbmFtZT0iUmVzdWx0cy9GaWd1cmVzL2RpZmZUaXNzdWVzL2NvckVBQVJfY3ZzX2NvcmRfSVRVX0YucG5nIiwgd2lkdGg9MjYwMCwgaGVpZ2h0PTE2MDAsIHJlcz01MDApCmNvcl9jdnNfY29yZF9yZXNpZF9mCmRldi5vZmYoKQoKcG5nKGZpbGVuYW1lPSJSZXN1bHRzL0ZpZ3VyZXMvZGlmZlRpc3N1ZXMvYm94RUFBUl9jdnNfY29yZF9JVFUucG5nIiwgd2lkdGg9MjgwMCwgaGVpZ2h0PTE0MDAsIHJlcz00MDApCmJveF9jdnNfY29yZF9yZXNpZCAKZGV2Lm9mZigpCgojbGV2ZW5lcyB0ZXN0IApsZXZlbmVUZXN0KHZhbHVlIH4gdmFyaWFibGUsIHJlc2lkX2N2c2NvcmRfaXR1X2xzLCBjZW50ZXI9bWVhbikKIyBzaWduaWZpY2FudAojIExldmVuZSdzIFRlc3QgZm9yIEhvbW9nZW5laXR5IG9mIFZhcmlhbmNlIChjZW50ZXIgPSBtZWFuKQojICAgICAgICBEZiBGIHZhbHVlICAgIFByKD5GKSAgICAKIyBncm91cCAgIDEgICAxNC4xMyAwLjAwMDI1NjcgKioqCiMgICAgICAgMTMwICAgCmBgYAoKYGBge3J9CiMgcGFpcmVkIHQtdGVzdApkIDwtIHdpdGgocmVzaWRfY3ZzY29yZF9pdHVfbHMsIAogICAgICAgIHZhbHVlW3ZhcmlhYmxlID09ICJDVlMiXSAtIHZhbHVlW3ZhcmlhYmxlID09ICJDb3JkIGJsb29kIl0pCiMgU2hhcGlyby1XaWxrIG5vcm1hbGl0eSB0ZXN0IGZvciB0aGUgZGlmZmVyZW5jZXMKc2hhcGlyby50ZXN0KGQpCiMgZGlzdHJpYnV0aW9uIG9mIHRoZSBkaWZmZXJlbmNlcyAoZCkgYXJlIHNpZ25pZmljYW50bHkgZGlmZmVyZW50IGZyb20gbm9ybWFsCgp0X3BhaXJlZF9pdHVfY3ZzY29yZF9yZXNpZCA8LSB0LnRlc3QodmFsdWUgfiB2YXJpYWJsZSwgZGF0YSA9IHJlc2lkX2N2c2NvcmRfaXR1X2xzLCBwYWlyZWQgPSBUUlVFKQp0aWR5X3RfcGFpcmVkX2l0dV9jdnNjb3JkX3Jlc2lkIDwtIGJyb29tOjp0aWR5KHRfcGFpcmVkX2l0dV9jdnNjb3JkX3Jlc2lkKQoKd2lsY19wYWlyZWRfaXR1X2N2c2NvcmRfcmVzaWQgPC0gd2lsY294LnRlc3QodmFsdWUgfiB2YXJpYWJsZSwgZGF0YSA9IHJlc2lkX2N2c2NvcmRfaXR1X2xzLCBwYWlyZWQgPSBUUlVFKQpxbm9ybSh3aWxjX3BhaXJlZF9pdHVfY3ZzY29yZF9yZXNpZCRwLnZhbHVlLzIpCndpbGNveG9uWihyZXNpZF9jdnNjb3JkX2l0dSRgQ29yZCBibG9vZGAsIHJlc2lkX2N2c2NvcmRfaXR1JENWUywgcGFpcmVkID0gVFJVRSkKdGlkeV93aWxjX3BhaXJlZF9pdHVfY3ZzY29yZF9yZXNpZCA8LSBicm9vbTo6dGlkeSh3aWxjX3BhaXJlZF9pdHVfY3ZzY29yZF9yZXNpZCkKCndyaXRlLmNzdih0aWR5X3RfcGFpcmVkX2l0dV9jdnNjb3JkX3Jlc2lkLCAiUmVzdWx0cy9UYWJsZXMvdF9wYWlyZWRfaXR1X2VhYXJfY3ZzY29yZF9yZXNpZC5jc3YiKQp3cml0ZS5jc3YodGlkeV93aWxjX3BhaXJlZF9pdHVfY3ZzY29yZF9yZXNpZCwgIlJlc3VsdHMvVGFibGVzL3dpbGNfcGFpcmVkX2l0dV9lYWFyX2N2c2NvcmRfcmVzaWQuY3N2IikKCndpbGNfcGFpcmVkX2l0dV9jdnNjb3JkX3Jlc2lkCmRkcGx5KHJlc2lkX2N2c2NvcmRfaXR1X2xzLCAuKHZhcmlhYmxlKSwgY29sd2lzZShtZWFuKSkKZGRwbHkocmVzaWRfY3ZzY29yZF9pdHVfbHMsIC4odmFyaWFibGUpLCBjb2x3aXNlKHNkKSkKYGBgCgpgYGB7cn0KcG5nKGZpbGVuYW1lPSJSZXN1bHRzL0ZpZ3VyZXMvZGlmZlRpc3N1ZXMvRUFBUl9jb3JyZWxhdGlvbnNfdGlzc3Vlcy5wbmciLCB3aWR0aD0zMDAwLCBoZWlnaHQ9MjAwMCwgcmVzPTMwMCkKZ3JpZEV4dHJhOjpncmlkLmFycmFuZ2UoY29yX2N2c19wbGFjZW50YV9yZXNpZCwgY29yX2N2c19jb3JkX3Jlc2lkLCBjb3JfY29yZF9wbGFjZW50YV9yZXNpZCwgY29yX2NvcmRfcGxhY2VudGFfcmVzaWRfcHJlZG8sIG5jb2wgPSAyKQpkZXYub2ZmKCkKYGBgCgpbdG8gdGhlIHRvcF0oI3RvcCkgCgojIyBEaWZmZXJlbmNlIGluIEVBQVIgYmV0d2VlbiBUaXNzdWVzIHsjRGlmZmVyZW5jZUVBQVJUaXNzdWVzfSAgCgoqaW5kaXZpZHVhbHMgd2l0aCBkYXRhIGZyb20gY29yZGJsb29kICsgcGxhY2VudGEgLUlUVSAqCmBgYHtyfQojIGRpZmZlcmVuY2UgYmV0d2VlbiBjb3JkYmxvb2QgYW5kIHBsYWNlbnRhCkRhdGFfQ29yZF9QbGFjZW50YV9JVFUkZGlmZmVyZW5jZUVBQVIgPC0gRGF0YV9Db3JkX1BsYWNlbnRhX0lUVSRFQUFSX0JvaGxpbiAtIERhdGFfQ29yZF9QbGFjZW50YV9JVFUkRUFBUl9MZWUKI249MzkwCmBgYAoKCmBgYHtyfQojIFdoYXQgaXMgdGhlIGFic29sdXRlIGRpZmZlcmVuY2UgYmV0d2VlbiBjb3JkYmxvb2QgYW5kIHBsYWNlbnRhPwpEYXRhX0NvcmRfUGxhY2VudGFfSVRVJGFic2RpZmZlcmVuY2VFQUFSIDwtIGFicyhEYXRhX0NvcmRfUGxhY2VudGFfSVRVJEVBQVJfQm9obGluIC0gRGF0YV9Db3JkX1BsYWNlbnRhX0lUVSRFQUFSX0xlZSkKYGBgCgoKYGBge3J9CmJveF9hYnNfcmVzaWRfSVRVIDwtIGdncGxvdChEYXRhX0NvcmRfUGxhY2VudGFfSVRVLCBhZXMoeCA9Q2hpbGRfU2V4LCB5ID0gYWJzZGlmZmVyZW5jZUVBQVIpKSArCiAgZ2VvbV9ib3hwbG90KCkgKwogIGxhYnMoeD0iY2hpbGQgc2V4IiwgeT0iYWJzb2x1dGUgZGlmZmVyZW5jZSBiZXR3ZWVuIEVBQVJzIiwgdGl0bGU9IklUVSIpCgptZWx0X0RhdGFfQ29yZF9QbGFjZW50YV9JVFUgPC0gcmVzaGFwZTI6Om1lbHQoRGF0YV9Db3JkX1BsYWNlbnRhX0lUVVsgLGMoIkVBQVJfQm9obGluIiwgIkVBQVJfTGVlIildKQoKYm94X0VBQVJfY29yZHBsYWNlbnRhX0lUVSA8LSBnZ3Bsb3QobWVsdF9EYXRhX0NvcmRfUGxhY2VudGFfSVRVLCBhZXMoeCA9ZmFjdG9yKHZhcmlhYmxlKSwgeSA9IHZhbHVlKSkgKwogIGdlb21fYm94cGxvdCgpICsKICBsYWJzKHg9IiIsIHk9IkVBQVIiKSsKICBzY2FsZV94X2Rpc2NyZXRlKGxhYmVscyA9IGMoJ2NvcmQgYmxvb2QnLCdwbGFjZW50YScpKQoKaGlzdHNfYWJzX3Jlc2lkX0lUVSA8LSBnZ3Bsb3QoRGF0YV9Db3JkX1BsYWNlbnRhX0lUVSwgYWVzKHg9YWJzZGlmZmVyZW5jZUVBQVIpKSsgCiAgZ2VvbV9oaXN0b2dyYW0oYmlucz01OCkrCiAgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcz1jKDAsMC41LDEsMS41LDIsMi41LDMsMy41LDQsNC41LDUpKSsKICBsYWJzKHg9ImFic29sdXRlIGRpZmZlcmVuY2UgYmV0d2VlZW4gRUFBUnMgXG4oY29yZCBibG9vZCB2cy4gcGxhY2VudGEpIix5PSJDb3VudCAobiA9IDM2MykiKSsKICB0aGVtZV9idygpKwogIHRoZW1lKHRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE1KSwgYXhpcy50aXRsZS54PSBlbGVtZW50X3RleHQoc2l6ZT0xNSksIGF4aXMudGl0bGUueT0gZWxlbWVudF90ZXh0KHNpemU9MTUpKQoKCmhpc3RzX3Jlc2lkX0lUVSA8LSBnZ3Bsb3QoRGF0YV9Db3JkX1BsYWNlbnRhX0lUVSwgYWVzKHg9ZGlmZmVyZW5jZUVBQVIpKSsgCiAgZ2VvbV9oaXN0b2dyYW0oYmlucz01OCkrCiAgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcz1jKC01LCAtNCwgLTMsIC0yLCAtMSwgMCwgMSwgMiwgMywgNCwgNSkpKwogIGxhYnMoeD0iQ29yZCBibG9vZCAtIGZldGFsIFBsYWNlbnRhIChFQUFScykiLCB5ID0gIkNvdW50IChuID0gMzYzKSIpKwogIHRoZW1lX2J3KCkrCiAgdGhlbWUodGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTUpLCBheGlzLnRpdGxlLng9IGVsZW1lbnRfdGV4dChzaXplPTE1KSwgYXhpcy50aXRsZS55PSBlbGVtZW50X3RleHQoc2l6ZT0xNSkpCgoKZ3JpZC5hcnJhbmdlKGJveF9hYnNfcmVzaWRfSVRVLCBoaXN0c19hYnNfcmVzaWRfSVRVLCBuY29sPTIpCgptZWRpYW4oRGF0YV9Db3JkX1BsYWNlbnRhX0lUVSRhYnNkaWZmZXJlbmNlRUFBUiwgbmEucm09VCkKCmJveF9FQUFSX2NvcmRwbGFjZW50YV9JVFUKCmhpc3RzX3Jlc2lkX0lUVQoKYGBgCgoqaW5kaXZpZHVhbHMgd2l0aCBkYXRhIGZyb20gY29yZCBibG9vZCBhbmQgcGxhY2VudGEgLSBQUkVETyoKYGBge3J9CiMgZGlmZmVyZW5jZSBiZXR3ZWVuIGNvcmRibG9vZCBhbmQgcGxhY2VudGEKRGF0YV9QUkVET19FUElDX0NvcmRfUGxhY2VudGEkZGlmZmVyZW5jZUVBQVIgPC0gRGF0YV9QUkVET19FUElDX0NvcmRfUGxhY2VudGEkRUFBUl9Cb2hsaW4gLSBEYXRhX1BSRURPX0VQSUNfQ29yZF9QbGFjZW50YSRFQUFSX0xlZQpgYGAKPGRpdiBjbGFzcz0iYWxlcnQgYWxlcnQtaW5mbyI+CiogdmFyaWFibGUgZGlmZmVyZW5jZXJlc2lkdWFsR0FDID0gcmVzaWR1YWwgR0EgZm9yIGNvcmRibG9vZCBtaW51cyByZXNpZHVhbCBHQSBmb3IgcGxhY2VudGEgKHJlc2lkdWFsIGZyb20gRE5BbUdBfkdBKSAgICAKPC9kaXY+CgpgYGB7cn0KIyBXaGF0IGlzIHRoZSBhYnNvbHV0ZSBkaWZmZXJlbmNlIGJldHdlZW4gY29yZGJsb29kIGFuZCBwbGFjZW50YT8KRGF0YV9QUkVET19FUElDX0NvcmRfUGxhY2VudGEkYWJzZGlmZmVyZW5jZUVBQVIgPC0gYWJzKERhdGFfUFJFRE9fRVBJQ19Db3JkX1BsYWNlbnRhJEVBQVJfQm9obGluIC0gRGF0YV9QUkVET19FUElDX0NvcmRfUGxhY2VudGEkRUFBUl9MZWUpCmBgYAo8ZGl2IGNsYXNzPSJhbGVydCBhbGVydC1pbmZvIj4KKiB2YXJpYWJsZSBhYnNkaWZmZXJlbmNlcmVzaWR1YWxHQUMgPSBhYnNvbHV0ZSBkaWZmZXJlbmNlIGJldHdlZW4gcmVzaWR1YWwgR0EgZm9yIGNvcmRibG9vZCB2cyBwbGFjZW50YQo8L2Rpdj4KCmBgYHtyfQpib3hfYWJzX3Jlc2lkX1BSRURPIDwtIGdncGxvdChEYXRhX1BSRURPX0VQSUNfQ29yZF9QbGFjZW50YSwgYWVzKHggPUNoaWxkX1NleCwgeSA9IGFic2RpZmZlcmVuY2VFQUFSKSkgKwogIGdlb21fYm94cGxvdCgpICsKICBsYWJzKHg9ImNoaWxkIHNleCIsIHk9ImFic29sdXRlIGRpZmZlcmVuY2UgYmV0d2VlbiBFQUFScyIsIHRpdGxlPSJQUkVETyIpCgpoaXN0c19hYnNfcmVzaWRfUFJFRE8gPC0gZ2dwbG90KERhdGFfUFJFRE9fRVBJQ19Db3JkX1BsYWNlbnRhLCBhZXMoeD1hYnNkaWZmZXJlbmNlRUFBUikpKyAKICBnZW9tX2hpc3RvZ3JhbShiaW5zPTU4KSsKICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzPWMoMCwwLjUsMSwxLjUsMiwyLjUsMywzLjUsNCw0LjUsNSkpKwogIGxhYnMoeD0iYWJzb2x1dGUgZGlmZmVyZW5jZSBiZXR3ZWVlbiBFQUFScyBcbihjb3JkIGJsb29kIHZzLiBwbGFjZW50YSkiLHk9IkNvdW50IChuID0gMTE2KSIpKwogIHRoZW1lX2J3KCkrCiAgdGhlbWUodGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTUpLCBheGlzLnRpdGxlLng9IGVsZW1lbnRfdGV4dChzaXplPTE1KSwgYXhpcy50aXRsZS55PSBlbGVtZW50X3RleHQoc2l6ZT0xNSkpCgoKZ3JpZC5hcnJhbmdlKGJveF9hYnNfcmVzaWRfUFJFRE8sIGhpc3RzX2Fic19yZXNpZF9QUkVETywgbmNvbD0yKQoKbWVkaWFuKERhdGFfUFJFRE9fRVBJQ19Db3JkX1BsYWNlbnRhJGFic2RpZmZlcmVuY2VFQUFSLCBuYS5ybT1UKQoKaGlzdHNfcmVzaWRfUFJFRE8gPC0gZ2dwbG90KERhdGFfUFJFRE9fRVBJQ19Db3JkX1BsYWNlbnRhLCBhZXMoeD1kaWZmZXJlbmNlRUFBUikpKyAKICBnZW9tX2hpc3RvZ3JhbShiaW5zPTU4KSsKICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzPWMoLTMsLTIsLTEsMCwxLDIsMyw0KSkrCiAgbGFicyh4PSJDb3JkIGJsb29kIC0gZGVjaWR1YWwgUGxhY2VudGEgKEVBQVJzKSIsIHk9IkNvdW50IChuID0gMTE2KSIpKwogIHRoZW1lX2J3KCkrCiAgdGhlbWUodGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTUpLCBheGlzLnRpdGxlLng9IGVsZW1lbnRfdGV4dChzaXplPTE1KSwgYXhpcy50aXRsZS55PSBlbGVtZW50X3RleHQoc2l6ZT0xNSkpCgogIAoKaGlzdHNfcmVzaWRfUFJFRE8KYGBgCgoKKmluZGl2aWR1YWxzIHdpdGggZGF0YSBmcm9tIGN2cyArIGNvcmRibG9vZCogIApgYGB7cn0KIyBkaWZmZXJlbmNlIGJldHdlZW4gY3ZzIGFuZCBjb3JkYmxvb2QgCkRhdGFfQ1ZTX0NvcmRfSVRVJGRpZmZlcmVuY2VFQUFSIDwtIERhdGFfQ1ZTX0NvcmRfSVRVJEVBQVJfTGVlIC0gRGF0YV9DVlNfQ29yZF9JVFUkRUFBUl9Cb2hsaW4KI249NzMKYGBgCgpgYGB7cn0KIyBXaGF0IGlzIHRoZSBhYnNvbHV0ZSBkaWZmZXJlbmNlIGJldHdlZW4gY29yZGJsb29kIGFuZCBwbGFjZW50YT8KRGF0YV9DVlNfQ29yZF9JVFUkYWJzZGlmZmVyZW5jZUVBQVIgPC0gYWJzKERhdGFfQ1ZTX0NvcmRfSVRVJEVBQVJfTGVlIC0gRGF0YV9DVlNfQ29yZF9JVFUkRUFBUl9Cb2hsaW4pCmBgYAoKYGBge3J9CmJveF9hYnNfcmVzaWRfSVRVX2NjIDwtIGdncGxvdChEYXRhX0NWU19Db3JkX0lUVSwgYWVzKHggPUNoaWxkX1NleCwgeSA9IGFic2RpZmZlcmVuY2VFQUFSKSkgKwogIGdlb21fYm94cGxvdCgpICsKICBsYWJzKHg9ImNoaWxkIHNleCIsIHk9ImFic29sdXRlIGRpZmZlcmVuY2UgYmV0d2VlbiBFQUFScyIsIHRpdGxlPSJJVFUiKQoKbWVsdF9EYXRhX0NWU19Db3JkX0lUVSA8LSByZXNoYXBlMjo6bWVsdChEYXRhX0NWU19Db3JkX0lUVVsgLGMoIkVBQVJfQm9obGluIiwgIkVBQVJfTGVlIildKQoKYm94X0VBQVJfY3ZzY29yZF9JVFUgPC0gZ2dwbG90KG1lbHRfRGF0YV9DVlNfQ29yZF9JVFUsIGFlcyh4ID1mYWN0b3IodmFyaWFibGUpLCB5ID0gdmFsdWUpKSArCiAgZ2VvbV9ib3hwbG90KCkgKwogIGxhYnMoeD0iIiwgeT0iRUFBUiIpCiAgI3NjYWxlX3hfZGlzY3JldGUobGFiZWxzID0gYygnY29yZCBibG9vZCcsJ3BsYWNlbnRhJykpCgpoaXN0c19hYnNfcmVzaWRfSVRVX2NjIDwtIGdncGxvdChEYXRhX0NWU19Db3JkX0lUVSwgYWVzKHg9YWJzZGlmZmVyZW5jZUVBQVIpKSsgCiAgZ2VvbV9oaXN0b2dyYW0oYmlucz01OCkrCiAgbGFicyh4PSJhYnNvbHV0ZSBkaWZmZXJlbmNlIGJldHdlZWVuIEVBQVJzIFxuKGNvcmQgYmxvb2QgdnMuIHBsYWNlbnRhKSIseT0iQ291bnQgKG4gPSA2NikiKSsKICB0aGVtZV9idygpKwogIHRoZW1lKHRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE1KSwgYXhpcy50aXRsZS54PSBlbGVtZW50X3RleHQoc2l6ZT0xNSksIGF4aXMudGl0bGUueT0gZWxlbWVudF90ZXh0KHNpemU9MTUpKQoKCmhpc3RzX3Jlc2lkX0lUVV9jYyA8LSBnZ3Bsb3QoRGF0YV9DVlNfQ29yZF9JVFUsIGFlcyh4PWRpZmZlcmVuY2VFQUFSKSkrIAogIGdlb21faGlzdG9ncmFtKGJpbnM9NTgpKwogIGNvb3JkX2NhcnRlc2lhbih4bGltID0gYygtNCwgNCkpKwogICNzY2FsZV94X2NvbnRpbnVvdXMobGltaXRzID0gYygtNCwgNCkpKwogIHNjYWxlX3hfY29udGludW91cyhicmVha3M9YygtNCwtMywgLTIsIC0xLCAwLCAxLCAyLCAzLDQpKSsKICBsYWJzKHg9IkNWUyAtIENvcmQgYmxvb2QgKEVBQVJzKSIsIHkgPSAiQ291bnQgKG4gPSA2NikiKSsKICB0aGVtZV9idygpKwogIHRoZW1lKHRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE1KSwgYXhpcy50aXRsZS54PSBlbGVtZW50X3RleHQoc2l6ZT0xNSksIGF4aXMudGl0bGUueT0gZWxlbWVudF90ZXh0KHNpemU9MTUpKQoKCmdyaWQuYXJyYW5nZShib3hfYWJzX3Jlc2lkX0lUVV9jYywgaGlzdHNfYWJzX3Jlc2lkX0lUVV9jYywgbmNvbD0yKQoKbWVkaWFuKERhdGFfQ1ZTX0NvcmRfSVRVJGFic2RpZmZlcmVuY2VFQUFSLCBuYS5ybT1UKQoKYm94X0VBQVJfY3ZzY29yZF9JVFUKCmhpc3RzX3Jlc2lkX0lUVV9jYwoKYGBgCgoqaW5kaXZpZHVhbHMgd2l0aCBkYXRhIGZyb20gY3ZzICsgcGxhY2VudGEqICAKYGBge3J9CiMgZGlmZmVyZW5jZSBiZXR3ZWVuIGN2cyBhbmQgcGxhY2VudGEgCkRhdGFfQ1ZTX1BsYWNlbnRhX0lUVSRkaWZmZXJlbmNlRUFBUiA8LSBEYXRhX0NWU19QbGFjZW50YV9JVFUkRUFBUl9MZWVfQ1ZTIC0gRGF0YV9DVlNfUGxhY2VudGFfSVRVJEVBQVJfTGVlX1BsYWNlbnRhCiNuPTg2CmBgYAoKYGBge3J9CiMgV2hhdCBpcyB0aGUgYWJzb2x1dGUgZGlmZmVyZW5jZSBiZXR3ZWVuIGNvcmRibG9vZCBhbmQgcGxhY2VudGE/CkRhdGFfQ1ZTX1BsYWNlbnRhX0lUVSRhYnNkaWZmZXJlbmNlRUFBUiA8LSBhYnMoRGF0YV9DVlNfUGxhY2VudGFfSVRVJEVBQVJfTGVlX0NWUyAtIERhdGFfQ1ZTX1BsYWNlbnRhX0lUVSRFQUFSX0xlZV9QbGFjZW50YSkKYGBgCgpgYGB7cn0KYm94X2Fic19yZXNpZF9JVFVfY3AgPC0gZ2dwbG90KERhdGFfQ1ZTX1BsYWNlbnRhX0lUVSwgYWVzKHggPUNoaWxkX1NleCwgeSA9IGFic2RpZmZlcmVuY2VFQUFSKSkgKwogIGdlb21fYm94cGxvdCgpICsKICBsYWJzKHg9ImNoaWxkIHNleCIsIHk9ImFic29sdXRlIGRpZmZlcmVuY2UgYmV0d2VlbiBFQUFScyIsIHRpdGxlPSJJVFUiKQoKbWVsdF9EYXRhX0NWU19QbGFjZW50YV9JVFUgPC0gcmVzaGFwZTI6Om1lbHQoRGF0YV9DVlNfUGxhY2VudGFfSVRVWyAsYygiRUFBUl9MZWVfQ1ZTIiwgIkVBQVJfTGVlX1BsYWNlbnRhIildKQoKYm94X0VBQVJfY3ZzcGxhY2VudGFfSVRVIDwtIGdncGxvdChtZWx0X0RhdGFfQ1ZTX1BsYWNlbnRhX0lUVSwgYWVzKHggPWZhY3Rvcih2YXJpYWJsZSksIHkgPSB2YWx1ZSkpICsKICBnZW9tX2JveHBsb3QoKSArCiAgbGFicyh4PSIiLCB5PSJFQUFSIikKICAjc2NhbGVfeF9kaXNjcmV0ZShsYWJlbHMgPSBjKCdjb3JkIGJsb29kJywncGxhY2VudGEnKSkKCmhpc3RzX2Fic19yZXNpZF9JVFVfY3AgPC0gZ2dwbG90KERhdGFfQ1ZTX1BsYWNlbnRhX0lUVSwgYWVzKHg9YWJzZGlmZmVyZW5jZUVBQVIpKSsgCiAgZ2VvbV9oaXN0b2dyYW0oYmlucz01OCkrCiAgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcz1jKDAsMC41LDEsMS41LDIsMi41LDMsMy41LDQsNC41LDUpKSsKICBsYWJzKHg9ImFic29sdXRlIGRpZmZlcmVuY2UgYmV0d2VlZW4gRUFBUnMgXG4oY29yZCBibG9vZCB2cy4gcGxhY2VudGEpIix5PSJDb3VudCAobiA9IDc4KSIpKwogIHRoZW1lX2J3KCkrCiAgdGhlbWUodGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTUpLCBheGlzLnRpdGxlLng9IGVsZW1lbnRfdGV4dChzaXplPTE1KSwgYXhpcy50aXRsZS55PSBlbGVtZW50X3RleHQoc2l6ZT0xNSkpCgoKaGlzdHNfcmVzaWRfSVRVX2NwIDwtIGdncGxvdChEYXRhX0NWU19QbGFjZW50YV9JVFUsIGFlcyh4PWRpZmZlcmVuY2VFQUFSKSkrIAogIGdlb21faGlzdG9ncmFtKGJpbnM9NTgpKwogIGNvb3JkX2NhcnRlc2lhbih4bGltID0gYygtMywgMykpKwogICNzY2FsZV94X2NvbnRpbnVvdXMobGltaXRzID0gYygtNCwgNCkpKwogIHNjYWxlX3hfY29udGludW91cyhicmVha3M9YygtMywgLTIsIC0xLCAwLCAxLCAyLCAzKSkrCiAgbGFicyh4PSJDVlMgLSBmZXRhbCBQbGFjZW50YSAoRUFBUnMpIiwgeSA9ICJDb3VudCAobiA9IDc4KSIpKwogIHRoZW1lX2J3KCkrCiAgdGhlbWUodGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTUpLCBheGlzLnRpdGxlLng9IGVsZW1lbnRfdGV4dChzaXplPTE1KSwgYXhpcy50aXRsZS55PSBlbGVtZW50X3RleHQoc2l6ZT0xNSkpCgoKZ3JpZC5hcnJhbmdlKGJveF9hYnNfcmVzaWRfSVRVX2NwLCBoaXN0c19hYnNfcmVzaWRfSVRVX2NwLCBuY29sPTIpCgptZWRpYW4oRGF0YV9DVlNfUGxhY2VudGFfSVRVJGFic2RpZmZlcmVuY2VFQUFSLCBuYS5ybT1UKQoKYm94X0VBQVJfY3ZzcGxhY2VudGFfSVRVCgpoaXN0c19yZXNpZF9JVFVfY3AKCmBgYAoKKmluZGl2aWR1YWxzIHdpdGggZGF0YSBmcm9tIGN2cyArIGNvcmRibG9vZCArIHBsYWNlbnRhKgoKYGBge3J9CnJlc2lkX0RhdGFfRnVsbF9JVFUgPC0gbmEub21pdChEYXRhX0Z1bGxfSVRVWyAsYygiU2FtcGxlX05hbWUiLCAiRUFBUl9Cb2hsaW4iLCAiRUFBUl9MZWVfQ1ZTIiwgIkVBQVJfTGVlX1BsYWNlbnRhIildKSAjNjAKcmVzaWRfRGF0YV9GdWxsX0lUVV96IDwtIHJlc2lkX0RhdGFfRnVsbF9JVFVbICxjKCJTYW1wbGVfTmFtZSIsICJFQUFSX0JvaGxpbiIsICJFQUFSX0xlZV9DVlMiLCAiRUFBUl9MZWVfUGxhY2VudGEiKV0KCnJlc2lkX0RhdGFfRnVsbF9JVFUkYENvcmQgYmxvb2RgIDwtIHJlc2lkX0RhdGFfRnVsbF9JVFUkRUFBUl9Cb2hsaW4KcmVzaWRfRGF0YV9GdWxsX0lUVSRDVlMgPC0gcmVzaWRfRGF0YV9GdWxsX0lUVSRFQUFSX0xlZV9DVlMKcmVzaWRfRGF0YV9GdWxsX0lUVSRgUGxhY2VudGEgKGZldGFsKWAgPC0gcmVzaWRfRGF0YV9GdWxsX0lUVSRFQUFSX0xlZV9QbGFjZW50YQpyZXNpZF9EYXRhX0Z1bGxfSVRVJEVBQVJfQm9obGluIDwtIE5VTEwKcmVzaWRfRGF0YV9GdWxsX0lUVSRFQUFSX0xlZV9DVlMgPC0gTlVMTApyZXNpZF9EYXRhX0Z1bGxfSVRVJEVBQVJfTGVlX1BsYWNlbnRhIDwtIE5VTEwKCnJlc2lkX0RhdGFfRnVsbF9JVFVfeiRgQ29yZCBibG9vZGAgPC0gc2NhbGUocmVzaWRfRGF0YV9GdWxsX0lUVV96JEVBQVJfQm9obGluKQpyZXNpZF9EYXRhX0Z1bGxfSVRVX3okQ1ZTIDwtIHNjYWxlKHJlc2lkX0RhdGFfRnVsbF9JVFVfeiRFQUFSX0xlZV9DVlMpCnJlc2lkX0RhdGFfRnVsbF9JVFVfeiRgUGxhY2VudGEgKGZldGFsKWAgPC0gc2NhbGUocmVzaWRfRGF0YV9GdWxsX0lUVV96JEVBQVJfTGVlX1BsYWNlbnRhKQpyZXNpZF9EYXRhX0Z1bGxfSVRVX3okRUFBUl9Cb2hsaW4gPC0gTlVMTApyZXNpZF9EYXRhX0Z1bGxfSVRVX3okRUFBUl9MZWVfQ1ZTIDwtIE5VTEwKcmVzaWRfRGF0YV9GdWxsX0lUVV96JEVBQVJfTGVlX1BsYWNlbnRhIDwtIE5VTEwKYGBgCgpgYGB7cn0KbG9uZ19yZXNpZF9EYXRhX0Z1bGxfSVRVX3ogPC0gbWVsdChhcy5kYXRhLnRhYmxlKHJlc2lkX0RhdGFfRnVsbF9JVFVfeiksIGlkLnZhcnMgPSAiU2FtcGxlX05hbWUiLCB2YXJpYWJsZS5uYW1lID0gInNhbXBsaW5nIikKbG9uZ19yZXNpZF9EYXRhX0Z1bGxfSVRVX3okc2FtcGxpbmcgPC0gZmFjdG9yKGxvbmdfcmVzaWRfRGF0YV9GdWxsX0lUVV96JHNhbXBsaW5nLCBsZXZlbHMgPSBjKCJDVlMiLCAiUGxhY2VudGEgKGZldGFsKSIsICJDb3JkIGJsb29kIikpCmBgYAoKYGBge3J9CmxvbmdfcmVzaWRfRGF0YV9GdWxsX0lUVSA8LSBtZWx0KGFzLmRhdGEudGFibGUocmVzaWRfRGF0YV9GdWxsX0lUVSksIGlkLnZhcnMgPSAiU2FtcGxlX05hbWUiLCB2YXJpYWJsZS5uYW1lID0gInNhbXBsaW5nIikKbG9uZ19yZXNpZF9EYXRhX0Z1bGxfSVRVJHNhbXBsaW5nIDwtIGZhY3Rvcihsb25nX3Jlc2lkX0RhdGFfRnVsbF9JVFUkc2FtcGxpbmcsIGxldmVscyA9IGMoIkNWUyIsICJQbGFjZW50YSAoZmV0YWwpIiwgIkNvcmQgYmxvb2QiKSkKYGBgCgpgYGB7cn0KbGlicmFyeShyYW5kb21jb2xvUikKbiA8LSA2MApwYWxldHRlIDwtIGRpc3RpbmN0Q29sb3JQYWxldHRlKG4pCmBgYAoKKlBsb3RzKgpgYGB7cn0KZ2dwbG90KGxvbmdfcmVzaWRfRGF0YV9GdWxsX0lUVV96LCBhZXMoeD1zYW1wbGluZywgeT12YWx1ZSwgZ3JvdXA9YXMuZmFjdG9yKFNhbXBsZV9OYW1lKSwgY29sb3I9YXMuZmFjdG9yKFNhbXBsZV9OYW1lKSkpICsgCiAgZ2VvbV9wb2ludCgpKwogIGdlb21fbGluZSgpKwogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXM9cGFsZXR0ZSkrCiAgdGhlbWVfYncoKSsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpKwogIHRoZW1lKHRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE1KSwgYXhpcy50aXRsZS54PSBlbGVtZW50X3RleHQoc2l6ZT0xNSksIGF4aXMudGl0bGUueT0gZWxlbWVudF90ZXh0KHNpemU9MTUpKSsKICBsYWJzKHg9IiIsIHkgPSAiei1zdGFuZGFyZGl6ZWQgRUFBUiIpCmBgYAoKYGBge3J9CmdncGxvdChsb25nX3Jlc2lkX0RhdGFfRnVsbF9JVFUsIGFlcyh4PXNhbXBsaW5nLCB5PXZhbHVlLCBncm91cD1hcy5mYWN0b3IoU2FtcGxlX05hbWUpLCBjb2xvcj1hcy5mYWN0b3IoU2FtcGxlX05hbWUpKSkgKyAKICBnZW9tX3BvaW50KCkrCiAgZ2VvbV9saW5lKCkrCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcz1wYWxldHRlKSsKICB0aGVtZV9idygpKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikrCiAgdGhlbWUodGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTUsIGNvbG9yPSJibGFjayIpLCBheGlzLnRpdGxlLng9IGVsZW1lbnRfdGV4dChzaXplPTE1LCBjb2xvcj0iYmxhY2siKSwgYXhpcy50aXRsZS55PSBlbGVtZW50X3RleHQoc2l6ZT0xNSksIGF4aXMudGV4dC54PWVsZW1lbnRfdGV4dChjb2xvdXI9ImJsYWNrIikpKwogIGxhYnMoeD0iIiwgeSA9ICJFQUFSIChuID0gNjApIikKYGBgCgpgYGB7cn0KcG5nKGZpbGU9IlJlc3VsdHMvRmlndXJlcy9kaWZmVGlzc3Vlcy9FQUFSX0NWU0NvcmRQbGFjZW50YV9JVFUucG5nIiwgd2lkdGg9MzAwMCwgaGVpZ2h0PTE1MDAsIHJlcz00MDApCmdncGxvdChsb25nX3Jlc2lkX0RhdGFfRnVsbF9JVFUsIGFlcyh4PXNhbXBsaW5nLCB5PXZhbHVlLCBncm91cD1hcy5mYWN0b3IoU2FtcGxlX05hbWUpLCBjb2xvcj1hcy5mYWN0b3IoU2FtcGxlX05hbWUpKSkgKyAKICBnZW9tX3BvaW50KCkrCiAgZ2VvbV9saW5lKCkrCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcz1wYWxldHRlKSsKICB0aGVtZV9idygpKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikrCiAgdGhlbWUodGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTEsIGNvbG9yPSJibGFjayIpLCBheGlzLnRpdGxlLng9IGVsZW1lbnRfdGV4dChzaXplPTEzLCBjb2xvcj0iYmxhY2siKSwgYXhpcy50aXRsZS55PSBlbGVtZW50X3RleHQoc2l6ZT0xMyksIGF4aXMudGV4dC54PWVsZW1lbnRfdGV4dChzaXplPTEzLCBjb2xvdXI9ImJsYWNrIikpKwogIGxhYnMoeD0iIiwgeSA9ICJFQUFSIChuID0gNjApIikKZGV2Lm9mZigpCgpgYGAKCmBgYHtyfQpwbmcoZmlsZT0iUmVzdWx0cy9GaWd1cmVzL2RpZmZUaXNzdWVzL0VBQVJfUGxhY2VudGFDb3JkX0lUVS5wbmciLCB3aWR0aD0yNTAwLCBoZWlnaHQ9MTUwMCwgcmVzPTQwMCkKaGlzdHNfYWJzX3Jlc2lkX0lUVQpkZXYub2ZmKCkKCnBuZyhmaWxlPSJSZXN1bHRzL0ZpZ3VyZXMvZGlmZlRpc3N1ZXMvRUFBUl9QbGFjZW50YUNvcmRfUFJFRE8ucG5nIiwgd2lkdGg9MjUwMCwgaGVpZ2h0PTE1MDAsIHJlcz00MDApCmhpc3RzX2Fic19yZXNpZF9QUkVETwpkZXYub2ZmKCkKCnBuZyhmaWxlPSJSZXN1bHRzL0ZpZ3VyZXMvZGlmZlRpc3N1ZXMvRUFBUl9QbGFjZW50YUNvcmQucG5nIiwgd2lkdGg9MzUwMCwgaGVpZ2h0PTE1MDAsIHJlcz00MDApCmdyaWQuYXJyYW5nZShoaXN0c19hYnNfcmVzaWRfSVRVLCBoaXN0c19hYnNfcmVzaWRfUFJFRE8sIG5jb2wgPSAyKQpkZXYub2ZmKCkKCnBuZyhmaWxlPSJSZXN1bHRzL0ZpZ3VyZXMvZGlmZlRpc3N1ZXMvRUFBUl9kaWZmQ29yZFBsYWNlbnRhX0lUVS5wbmciLCB3aWR0aD0yNTAwLCBoZWlnaHQ9MTUwMCwgcmVzPTQwMCkKaGlzdHNfcmVzaWRfSVRVCmRldi5vZmYoKQoKcG5nKGZpbGU9IlJlc3VsdHMvRmlndXJlcy9kaWZmVGlzc3Vlcy9FQUFSX2RpZmZDb3JkUGxhY2VudGFfUFJFRE8ucG5nIiwgd2lkdGg9MjUwMCwgaGVpZ2h0PTE1MDAsIHJlcz00MDApCmhpc3RzX3Jlc2lkX1BSRURPCmRldi5vZmYoKQoKcG5nKGZpbGU9IlJlc3VsdHMvRmlndXJlcy9kaWZmVGlzc3Vlcy9FQUFSX2RpZmZDVlNDb3JkX0lUVS5wbmciLCB3aWR0aD0yNTAwLCBoZWlnaHQ9MTUwMCwgcmVzPTQwMCkKaGlzdHNfcmVzaWRfSVRVX2NjCmRldi5vZmYoKQoKcG5nKGZpbGU9IlJlc3VsdHMvRmlndXJlcy9kaWZmVGlzc3Vlcy9FQUFSX2RpZmZQbGFjZW50YUNWU19JVFUucG5nIiwgd2lkdGg9MjUwMCwgaGVpZ2h0PTE1MDAsIHJlcz00MDApCmhpc3RzX3Jlc2lkX0lUVV9jcApkZXYub2ZmKCkKYGBgCgpbdG8gdGhlIHRvcF0oI3RvcCkgIAoK